【问题标题】:Bison mid rule actions are not working野牛中间规则动作不起作用
【发布时间】:2018-06-21 12:21:24
【问题描述】:

这是我的parser.y

stmt : type var { insertVar($2); cout<< "inserted"<<endl;} LCURL other RCURL {
             //other jobs
     }
     ;

lex.l

"{"  { cout<<"after insertion"<<endl; return LCURL;} 

当我使用 .c 文件运行这些时,输出如下:

 after insertion
 inserted

我的预期输出是:

 inserted
 after insertion

为什么会这样?

【问题讨论】:

    标签: compiler-construction bison flex-lexer yacc bisonc++


    【解决方案1】:

    Yacc/bison 语法使用一个前瞻标记(LALR(1) 中的1)来决定采取哪种解析操作。所以解析器和词法分析器不同步;前瞻标记的词法分析器操作通常会在紧接其之前的解析器归约之前执行。

    我写的是“经常”而不是“总是”,因为 Bison(但不是 yacc)有时会延迟读取前瞻令牌,如果它实际上不需要在解析中的那个点引用它。很难预测何时会进行这种优化。最好的规则是避免依赖解析器和词法分析器之间的动作执行顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多