0

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

4

1 回答 1

0

通常的解决方案是这样的:

expr_list ::= | expr_list expr ;
expr ::= if_then_else_statement ;
if_then_else_statement ::= IF LPAREN RPAREN expr ELSE expr ;

这不允许空else子句(或空then子句),因为空的 else 子句是模棱两可的:无法判断s2inif () s1 else s2是 else 子句还是在带有空 else 子句的完整 if 语句之后的语句。

为了解决这种歧义,您需要语句终止符(例如分号)或if语句终止符(fi并且end是常见的选择)或其他东西。

于 2016-03-14T17:34:04.290 回答