制作语法LL

时间:2014-03-11 00:55:19

标签: parsing compiler-construction grammar ll

我已经浪费了两倍的时间来转换它,但我总是起床得到共同的前缀ID。

任何人都可以向我解释一下吗?因为我正在努力做一个非常大的语法,需要我的基础知识。

A,B,C,D是唯一的非终端。

A : ‘(‘ B ‘)’ 
 | ID ASSIGN C 
 | C 

C : C '+' D 
 | C '-' D 
 | D 

D : ID 
 | ID '(' actuals ')' 
 | ID '(' ')' 
 | INT_LIT 
 | ‘(‘ C ‘)’ 


B : B ';' A | A

1 个答案:

答案 0 :(得分:1)

在LL中,生产不能有多个以同一终端开头的选项,所以如果愿意,可以将这些常用部分拉到共享头中。所以

D : ID 
 | ID '(' actuals ')' 
 | ID '(' ')' 
 | INT_LIT 
 | ‘(‘ C ‘)’ 

成为

的内容
D : D_things_that_start_with_ID
 | D_things_that_do_not_start_with_ID

,其中

D_things_that_start_with_ID :
  ID D_things_that_follow_ID

D_things_that_follow_ID :
  epsilon
  | '(' actuals ')' 
  | '(' ')' 

D_things_that_do_not_start_with_ID :
 INT_LIT 
 | ‘(‘ C ‘)’ 

以及其他常见的引导符号。