Bison 中间规则操作不起作用
Bison mid rule actions are not working
这是我的parser.y
stmt : type var { insertVar(); cout<< "inserted"<<endl;} LCURL other RCURL {
//other jobs
}
;
和lex.l
"{" { cout<<"after insertion"<<endl; return LCURL;}
当我 运行 这些带有 .c
文件时,输出如下:
after insertion
inserted
我的预期输出是:
inserted
after insertion
为什么会这样?
Yacc/bison 文法使用一个先行标记(LALR(1) 中的 1
)来决定采取哪种解析操作。所以解析器和词法分析器不同步;前瞻标记的词法分析器操作通常会在紧接在其之前的解析器缩减之前执行。
我写了 "often" 而不是 "always" 因为 Bison(但不是 yacc)有时会延迟读取先行标记,如果它实际上不需要在解析的那个点引用它的话。很难预测这种优化何时会发生。最好的规则是避免依赖解析器和词法分析器之间的动作执行顺序。
这是我的parser.y
stmt : type var { insertVar(); cout<< "inserted"<<endl;} LCURL other RCURL {
//other jobs
}
;
和lex.l
"{" { cout<<"after insertion"<<endl; return LCURL;}
当我 运行 这些带有 .c
文件时,输出如下:
after insertion
inserted
我的预期输出是:
inserted
after insertion
为什么会这样?
Yacc/bison 文法使用一个先行标记(LALR(1) 中的 1
)来决定采取哪种解析操作。所以解析器和词法分析器不同步;前瞻标记的词法分析器操作通常会在紧接在其之前的解析器缩减之前执行。
我写了 "often" 而不是 "always" 因为 Bison(但不是 yacc)有时会延迟读取先行标记,如果它实际上不需要在解析的那个点引用它的话。很难预测这种优化何时会发生。最好的规则是避免依赖解析器和词法分析器之间的动作执行顺序。