編譯原理實驗4 LL(1)文法分析

2021-07-08 16:19:31 字數 1793 閱讀 1355

本來是打算再寫乙個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 中某個終結符號開頭的串。類似的,如果 那麼 不能推導...