解析转移 - 减少冲突

时间:2016-03-14 16:31:57

标签: parsing compiler-construction reduce shift cup

我正在使用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语句而不使用优先级?

1 个答案:

答案 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语句终止符(fiend是常见选项)或其他内容。