Bison 如何重置解析树

Bison 如何重置解析树,bison,flex-lexer,parse-tree,Bison,Flex Lexer,Parse Tree,我创建了简单的加法和减法语法: S : EXPRESSION ENDLINE {printf("Result: %d\n",$1);} ; EXPRESSION : NUMBER '+' NUMBER {$$ = $1 + $3;} | NUMBER '-' NUMBER {$$ = $1 - $3;} ; NUMBER : NUM {$$ = $1;}

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

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

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

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

%%

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

这与重置解析树无关;您需要扩展语法以允许包含表达式的任意行数。只需扩展规则
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-是的,你像往常一样是对的。我进行了编辑以显示左递归,我本来应该这样做的!