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
競合が発生しました。
input を受け取ったときIDENT '<' IDENT
、yacc はシフトすべきか削減すべきかわかりません。
IDENT '<' args '>' '(' args ')'
よりも高い優先順位を取得したいexpr '<' call_expr
ので、次の expr を解析できます。
x < y
f<x>(a,b)
f<x,y>(a,b) < g<x,y>(c,d)
C++/C# の両方がこの構文をサポートしていることがわかります。この問題を yacc で解決する方法はありますか?
.y
ファイルを変更するにはどうすればよいですか?
ありがとうございました!