野牛中规矩动作不起作用

时间:2018-06-21 12:21:25

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

这是我的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

为什么会发生?

1 个答案:

答案 0 :(得分:1)

Yacc /野牛语法使用一个先行标记( LALR(1)中的1)来决定采取哪种解析动作。因此,解析器和词法分析器不同步;先行令牌的词法分析器操作通常在紧接其之前的解析器缩减之前执行。

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