作業十一 LL 1 文法的判斷

2022-07-16 20:51:15 字數 2848 閱讀 1111

1. 文法 g(s):

(1)s -> ab

(2)a ->da|ε

(3)b -> cc

(4)c -> aadc |ε

(5)d -> b|ε

驗證文法 g(s)是不是 ll(1)文法?

答:證明:first(da) =

first(ε) =

first(aadc) =

first(b) =

follow(a) =

follow(c) =

follow(d) =

select(a -> da) = first(da) =

select(a -> ε) = first(ε) - ufollow(a) = follow(a) =

因為select(a -> da) ∩ select(a -> ε) ≠ ø

所以g(s)不是 ll(1)文法。

2.法消除左遞迴之後的表示式文法是否是ll(1)文法?

答:文法為:(1)e -> te'

(2)e' -> +te' | ε

(3)t -> ft'

(4)t' -> *ft' | ε

(5)f -> (e) | i

first(+te') =

first(ε) =

first(*ft') =

first((e)) =

first(i) =

follow(e') =

follow(t') =

follow(f) =

select(e' -> +te') = first(+te') =

select(e' -> ε) = first(ε) - ufollow(e') = follow(e') =

select(t' -> *ft') = first(*ft') =

select(t' -> ε) = first(ε) - ufollow(t') = follow(t') =

select(f -> (e)) = first((e)) =

select(f->i)=first(i)=

因為select(e' -> +te') ∩ select(e' -> ε) = ø

select(t' -> *ft') ∩ select(t' -> ε) = ø

select(f -> (e)) ∩ select(f -> i) = ø

所以此表示式文法是ll(1)文法。

3.接2,如果是ll(1)文法,寫出它的遞迴下降語法分析程式**。

e(){t();

e'();

e'()

t()t'()

f()答:select集:

select(e->te')=first(te')=

select(e'->+te')=first(+te')=

select(e'->ε)=first(ε)-ufollow(e')=follow(e')=

select(t->ft')=first(ft')=

select(t'->*ft')=first(*ft')=

select(t'->ε)=first(ε)-ufollow(t')=follow(t')=

select(f->(e))=first((e))=

select(f->i)=first(i)=

遞迴下降語法分析程式:

void parsee(){

switch(lookahead){

case '(','i':

parset();

parsee'();

break;

default:

print("syntax error \n");

exit(0);

void parsee'(){

switch(lookahead){

case '+':

matchtoken('+');

parset();

parsee'();

break;

case ')','#':

break;

default:

print("syntax error \n");

exit(0);

void parset(){ 

switch(lookahead){

case '(','i':

parsef();

parset'();

break;

default:

print("syntax error \n");

exit(0);

void parset'(){

switch(lookahead){

case '*':

matchtoken('*');

parsef();

parset'();

break;

case '+',')','#':

break;

default:

print("syntax error \n");

exit(0);

void parsef(){

switch(lookahead){

case '(':

matchtoken('(');

parsee();

matchtoken(')');

break;

case 'i':

matchtoken('i');

break;

default:

print("syntax error \n");

exit(0);

4.加上實驗一的詞法分析程式,形成可執行的語法分析程式,分析任意輸入的符號串是不是合法的表示式。

LL 1 文法判斷

ll 1 文法判斷 題型 1.判斷該文法是否是ll 1 文法?2.若是,給出它的ll 1 分析表,否則說明理由。概念 對於產生式 a 1.如果 均不能推導出 空語句 則 first first 2.和 至多有乙個能推導出 3.如果 經過0步或多步可以推導出 則 first follow a 關鍵 求...

LL(1)文法解析

一 問題描述 給定上下文無關文法,對其進行解析,得出first集和follow集。在有能力的情況下,可以求出ll 1 分析表。二 演算法設計 本程式主要分成三塊內容,第一是文法的讀入解析,第二是first集的求解,第三為follow集的求解。文法的解析需要根據整行讀入的文法,生成rulelist 表...

如何判斷文法是否是LL 1 文法

判斷該文法是不是ll 1 文法,說明理由 s abc a a b b first集合求法就是 能由非終結符號推出的所有的開頭符號或可能的 但要求這個開頭符號是終結符號。如此題a可以推導出a和 所以first a a,同理first b s可以推導出abc,還可以推導出bc,還可以推導出c,所以fir...