本來是打算再寫乙個select集生成器的,但是時間有限再加上懶後來還是放棄了= =。
這個**也是需要先新建乙個文字檔案sy4.in
文字檔案中第一行有乙個整數x,代表有x個產生式
接下來x行每行有三個字串,分別代表產生式左邊,右邊還有對應的select集
最後一行還有乙個字母s,代表起始字元
在讀入了資料之後,若文法是ll(1)文法,則會輸出"the data is ok!"
否則就是輸出「wrong data」,並且終止程式。
若文法ok,則直接輸入待分析的句子即可
若分析句子符合文法,則會輸出accepted,並且詢問是否輸出對應的最左推導。
否則輸出wrong!
輸入y以'^'開頭的字串則程式終止。
**如下:
#include#include#include#include#includeusing namespace std;
const int n = 105;
const int m = 55;
file *f1;
struct charhash
int insert(char c)
return mp[c];
}char find(int c)
void setnend(int c)
};/*}}}*/
charhash chhash;
struct unknowname
bool operator < (const derivation &a)const
};/*}}}*/
derivation der[n];
int n;
int table[m][m];
int queue[n],qcnt;
char schar;
void init();
void read()
bool check()
}puts(ok ? "the data is ok!" : "wrong data!");
return ok;
}void gettable()}}
bool analysis(char s)
if(chhash.end[u])
else
}else
top --;
for(int i = der[id].tcnt - 1 ; i >= 0 ; i --)
stack[top ++] = der[id].t[i];
queue[qcnt ++] = id;}}
if(top == 0 && tail == len)
else
}void output()
}};/*}}}*/
unknowname table;
int main()
printf("please input the string: (^ is over)");
}fclose(f1);
return 0;}/*
i+(i*i+i)
i(i)
((i))
i+i+
*/
樣例sy4.in如下:
8
e ta (i
a +ta +
a # )$
t fb (i
b *fb *
b # )+$
f (e) (
f i i
e
編譯原理實驗 LL(1)文法
目標任務 實現 ll 1 分析中控制程式 表驅動程式 完成以下描述算術表示式的 ll 1 文法的 ll 1 分析程式。g e e te e ate t ft t mft f e i a m 說明 終結符號 i 為使用者定義的簡單變數,即識別符號的定義。compiler3.cpp 定義控制台應用程式的...
CSUFT 編譯原理實驗二LL(1)文法分析
1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 10using namespace std 1112 char a 20 分析棧 13char b 20 剩餘串 14char v1 2...
編譯原理之證明LL 1 文法
ll 1 文法的證明方法 乙個文法g是ll 1 的,當且僅當g的任意兩個不同的產生式a 滿足下面的條件 1.不存在終結符號a使得 和 都能夠推導出以a開頭的串。2.和 中最多只有乙個可以推導出空串。3.如果 那麼 不能推導出任何以follow a 中某個終結符號開頭的串。類似的,如果 那麼 不能推導...