从这个问题中,涉及二元运算符(+ - * /)的表达式语法不允许使用外层括号:
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(*))?
- 是否可能为这个语法编写递归下降解析器?如何实现?(需要回溯吗?)
- 是否可能简化这个语法以便于递归下降方法?
expression_or_term1
->expression1
->empty
,因此top_level
->'(' expression ')'
,这不是原始语法中的内容... - Chris Doddf: t | t '+' f
捕获了算术语法的语法和语义;f: t f'; f': | '+' f'
则没有。 - rici