1

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

为什么会这样?

4

1 回答 1

1

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

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

于 2018-06-21T13:42:10.783 回答