【问题标题】:How to reset a parse tree如何重置解析树
【发布时间】:2015-12-08 19:17:40
【问题描述】:

我为加减法创建了简单的语法:

S : EXPRESSION ENDLINE      {printf("Result: %d\n",$1);}    
  ;

EXPRESSION  
    : NUMBER '+' NUMBER     {$$ = $1 + $3;}           
    | NUMBER '-' NUMBER         {$$ = $1 - $3;}      
    ;

NUMBER : NUM            {$$ = $1;}
       ;

%%

到达 S 终端后,我想在打印第一个结果后编写新的输入。不幸的是,我在插入第二个公式后收到了语法错误。我怎样才能做到这一点?我将不胜感激。

【问题讨论】:

    标签: bison flex-lexer parse-tree


    【解决方案1】:

    这不是重置解析树;您需要扩展语法以允许包含表达式的任意数量的行。只需扩展规则 S 以包含递归调用,如下所示:

    S : EXPRESSION ENDLINE      {printf("Result: %d\n",$1);}  
      | S EXPRESSION ENDLINE     {printf("Result: %d\n",$2);}
      ;
    

    这可能有点俗气,所以你可以添加一个新规则来达到同样的效果:

    S: RESULT
     | S RESULT
     ;
    
    RESULT : EXPRESSION ENDLINE      {printf("Result: %d\n",$1);}
    

    【讨论】:

    • 第一个不会按预期工作,因为它会以相反的顺序打印结果,并且只有在输入完成时才会打印。第二个将起作用,但会不必要地咀嚼解析器堆栈。除非您有充分的理由不这样做,否则请始终使用左递归。
    • @rici - 是的,你像往常一样是对的。我进行了编辑以显示左递归,我一开始就应该这样做!
    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多