我正在使用JavaCUP工具为我的语言生成解析器。我正在尝试编写一个匹配嵌套和多个if_else语句的语法。
输入文件
// matches
if ()
if ()
else
if ()
else
else
// no match -> modifying grammar leads to shift/reduce conflict
if ()
else
语法
expr ::= if_then_else_statement;
if_then_else_statement ::= IF LPAREN RPAREN if_then_else_statement ELSE if_then_else_statement
| ;
此语法与嵌套的if_else语句匹配。但是它只识别输入文件的第一个嵌套if_else语句。
我修改了我的语法,以便匹配多个这样的语句:
expr ::= expr if_then_else_statement;
| ;
if_then_else_statement ::= IF LPAREN RPAREN if_then_else_statement ELSE if_then_else_statement
| ;
结果是由空规则引起的转移/减少冲突(我猜)。如何修改它以支持嵌套和多个if_else语句而不使用优先级?
答案 0 :(得分:0)
通常的解决方案是这样的:
expr_list ::= | expr_list expr ;
expr ::= if_then_else_statement ;
if_then_else_statement ::= IF LPAREN RPAREN expr ELSE expr ;
这不允许空else
子句(或空then
子句),因为空的else子句不明确:无法判断s2
是否if () s1 else s2
是else子句或带有空else子句的完整if语句后面的语句。
要解决这种歧义,您需要语句终止符(例如,分号)或if
语句终止符(fi
和end
是常见选项)或其他内容。