【问题标题】:Why if I add lambda left recursion occurs?为什么如果我添加 lambda 左递归会发生?
【发布时间】:2014-01-18 13:52:09
【问题描述】:

我正在尝试使用 flex bison 编写 if 语法,但在解析器中我遇到了问题

这是cpp中if语法的语法

    program : //start rule
         |statements;
    block:
        TOKEN_BEGIN statements ';'TOKEN_END;
    reexpression:
    |   TOKEN_OPERATOR expression;

    expression:  //x+2*a*3
        TOKEN_ID reexpression
    |   TOKEN_NUMBER reexpression;


    assignment:
        TOKEN_ID'='expression
    statement:
        assignment;
    statements:
        statement';'
    |   block
    |   if_statement;

    else_statement:
        TOKEN_ELSE statements ;

    else_if_statement:
        TOKEN_ELSE_IF '(' expression ')' statements;

    if_statement:
        TOKEN_IF '(' expression ')' statements else_if_statement else_statement;

我不明白为什么如果我替换这三个规则,就会发生左递归我只是将 lambda 添加到这些规则中

     else_statement:
        |TOKEN_ELSE statements ;

     else_if_statement:
        |TOKEN_ELSE_IF '(' expression ')' statements;

     if_statement:
        TOKEN_IF '(' expression ')' statements else_if_statement else_statement;

请帮助我理解。

【问题讨论】:

    标签: parsing grammar bison context-free-grammar left-recursion


    【解决方案1】:

    不涉及 lambda左递归

    当您将 epsilon 添加到 if 规则(使 else 可选)时,您会遇到冲突,因为生成的语法是模棱两可的。这是经典的 dangling else 歧义,当您有两个 if 和一个 else 时,else 可以绑定到其中一个 if。

    IF ( expr1 ) IF ( expr2 ) block1 ELSE block2
    

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 2012-08-02
      • 2020-09-04
      • 1970-01-01
      • 2013-02-19
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多