【发布时间】:2016-07-06 03:00:51
【问题描述】:
来自this question,一种涉及二元运算符 (+ - * /) 的表达式语法,它不允许使用外括号:
top_level : expression PLUS term
| expression MINUS term
| term TIMES factor
| term DIVIDE factor
| NUMBER
expression : expression PLUS term
| expression MINUS term
| term
term : term TIMES factor
| term DIVIDE factor
| factor
factor : NUMBER
| LPAREN expression RPAREN
这个语法是 LALR(1)。因此,我能够使用PLY(yacc 的 Python 实现)为语法创建自下而上的解析器。
出于比较的目的,我现在想尝试为相同的语言构建一个自顶向下的递归下降解析器。我已经改变了语法,删除了左递归并应用了左因子:
top_level : expression top_level1
| term top_level2
| NUMBER
top_level1 : PLUS term
| MINUS term
top_level2 : TIMES factor
| DIVIDE factor
expression : term expression1
expression1 : PLUS term expression1
| MINUS term expression1
| empty
term : factor term1
term1 : TIMES factor term1
| DIVIDE factor term1
| empty
factor : NUMBER
| LPAREN expression RPAREN
如果没有top_level 规则,这个语法就是LL(1),所以编写一个递归下降解析器会相当简单。不幸的是,包括top_level,语法不是LL(1)。
- 此语法是否有“LL”分类(例如 LL(k)、LL(*))?
- 是否可以为此语法编写递归下降解析器?那怎么做? (需要回溯吗?)
- 是否可以简化此语法以简化递归下降方法?
【问题讨论】:
标签: parsing grammar context-free-grammar ll lr