我有一个用于解析 C++ 表达式的 YACC 语法。这是精简版:
// yacc.y
%token IDENT
%%
expr:
call_expr
| expr '<' call_expr
| expr '>' call_expr
;
call_expr:
IDENT
| '(' expr ')'
| IDENT '<' args '>' '(' args ')'
;
args:
IDENT
| args ',' IDENT
;
%%
当我想支持带有模板参数的函数调用时,我遇到了shift/reduce
冲突。
当我们得到 inputIDENT '<' IDENT
时,yacc 不知道我们应该转移还是减少。
我想得到IDENT '<' args '>' '(' args ')'
比 更高的优先级expr '<' call_expr
,所以我可以解析以下表达式。
x < y
f<x>(a,b)
f<x,y>(a,b) < g<x,y>(c,d)
我看到 C++/C# 都支持这种语法。有没有办法用yacc解决这个问题?
如何修改.y
文件?
谢谢!