特定のクエリ言語用に 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がinとcastExp
衝突し、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: 別の解決策は、bison GLR パーサーを使用することですが、パフォーマンスが低下するため、これは望ましくありません。
bison -v
出力はこちら。