parsing - 制作语法 LL

标签 parsing compiler-construction grammar ll

我已经在转换它上浪费了很多时间,但我总是起床得到公共(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/

相关文章:

parsing - 制作语法 LL(1)

algorithm - 递归下降优先级解析——匹配较低优先级的前缀表达式

parsing - 如何在简单语法中添加括号作为最高优先级?

Javascript Regex - 将结构化字符串解析为带有替换的对象

c++ - 编译器如何知道我的 CPU 的指令集?

c++ - 为什么 vptr 存储在具有虚函数的类的内存中的第一个条目?

c++ - 使用代码将字符集设置为多字节

python - 希腊语上下文无关语法

python - Beautiful Soup 获取动态表数据

regex - 使用正则表达式进行日志解析