-
大小: 13KB文件類型: .cpp金幣: 1下載: 0 次發布日期: 2021-06-03
- 語言: C/C++
- 標簽: fundamentals??
資源簡介
編譯原理的LL(1)文法判斷代碼,可以在codeblocks上無礙運行(湊字數用:祝大家學習進步天天開心)
代碼片段和文件信息
#include
using?namespace?std;
#define?MAX?100
struct?state
{
????char?sta;//狀態
????string?f[MAX];//?產生式
????int?num;//產生式個數
};
struct??grammer
{
????string?VT?;//終結符
????string?VN;//非終結符
????struct?state?states[MAX];//產生式
????char?S;//開始符
????int?tnum?;//終結符個數2
????int?nnum?;//非終結符?個數
????string?vns;//能推出空串的非終結符
};
struct??grammer?gram;//定義一個文法
string?First[MAX];//first集合
string?Follow[MAX];//follow集合
string?FolChild[MAX];//follow[A]的子集序列
string?Select[MAX][MAX];//select?集合?非終結符?產生式
int?position(char?astring?s);//根據終態a查找a在有限狀態集中的位置
void?receiveGra();//接收文法
void?calculateFirst();//計算FIRST集合
void?calculateFollow();//計算FOLLOW集合
void?calculateSelect();//計算select集合
int?isallvn(string?a);
int?judge();//判斷
void?printGra();//輸出文法
int?main()
{
????receiveGra();
????calculateFirst();
????calculateFollow();
????calculateSelect();
????printGra();
????return?0;
}
void?receiveGra()?//接受文法
{
????gram.tnum?=?0;
????gram.nnum?=?0;
????cout<<“請輸入開始符:“< ????cin>>gram.S;
????cout<<“請輸入產生式以#結束(空串以^代替):“< ????string?temp;
????while(1)
????{
????????cin>>temp;
????????if(temp[0]==‘#‘)
????????????break;
????????int?j?=?position(temp[0]gram.VN);//找到狀態的位置
????????if(j<0)?//未出現過
????????{
????????????gram.VN+=temp[0];
????????????gram.states[gram.nnum].sta?=?temp[0];
????????????for(int?m?=?3;?m ????????????????gram.states[gram.nnum].f[0]+=temp[m];
????????????gram.states[gram.nnum].num?=?1;
????????????gram.nnum++;
????????}
????????else??//出現過
????????{
????????????int?n?=?gram.states[j].num;
????????????for(int?m?=?3;?m ????????????????gram.states[j].f[n]+=temp[m];
????????????gram.states[j].num++;
????????}
????????if(temp[3]==‘^‘)
????????????if(position(gram.states[j].stagram.vns)<0)
????????????????gram.vns+=gram.states[j].sta;//能推出空串的非終結符
????}
????for(int?i?=?0;?i ????{
????????struct?state?st?=?gram.states[i];
????????for(int?j?=?0;?j ????????{
????????????string?a?=?st.f[j];
????????????for(int?p?=?0;?p ????????????{
????????????????if(position(a[p]gram.VN)<0)
????????????????????if(position(a[p]gram.VT)<0)?gram.VT+=a[p];
????????????}
????????}
????}
????cout<<“輸入結束!“<
}
void?calculateFirst()?//計算FIRST集合?對每個非終結符計算first
{
????struct?state?st;
????for(int?i?=?0;?i ????{
????????int?flag?=?0;//標志
????????st?=?gram.states[i];
????????if(position(st.stagram.VT)<0)
????????{
????????????// cout< ????????????for(int?j?=?0;?j ????????????{
????????????????string?temp?=?st.f[j];
????????????????if(position(temp[0]gram.VT)!=-1)?//遇到終結符
????????????????{
????????????????????if(position(temp[0]First[i])<0)
????????????????????{
????????????????????????First[i]+=temp[0];
????????????????????????flag?=?1;
????????????????????}
????????????????}
????????????????else
????????????????{
??
- 上一篇:fmod 音頻庫 c++ Qt編寫
- 下一篇:C語言 華容道源代碼
評論
共有 條評論