我正在为某种查询语言编写一个 bison+flex 解析器,我需要向它添加一个 C 风格的强制转换运算符。这是代码的相关部分:
%token <characterToken> Identifier
%token <commandToken> LRPAR RRPAR
%type <characterToken> typename
%type <operationValue> generalExp castExp variable
%%
generalExp: variable
| LRPAR generalExp RRPAR
{ /* some code here */ }
| castExp
;
castExp: LRPAR typename RRPAR generalExp
{ /* some code here */ }
;
variable: Identifier
{ /* some code here*/ };
typename: Identifier;
%%
这里的问题是(typename)
in与incastExp
发生冲突并产生 reduce/reduce 冲突:(variable)
generalExp
test.yy: conflicts: 1 reduce/reduce
test.yy:23.11-20: warning: rule useless in parser due to conflicts: typename: Identifier
可能的解决方案是在相应的 lex 文件中列出所有有效的类型名(如 long、int、char),但是我也需要支持使用定义的类型。
UPD:另一种解决方案是使用野牛 GLR 解析器,由于性能下降,我不想要它。
bison -v
输出在这里。