我已经在转换它上浪费了很多时间,但我总是起床得到公共(public)前缀 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
最佳答案
在 LL 中,一个产品不能有多个选项从同一个终端开始,所以如果您愿意,您可以将这些公共(public)部分拉到一个共享的头中。所以
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 ‘)’
对于其他常见的前导符号依此类推。
关于parsing - 制作语法 LL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22314394/