1

非常に基本的な C++ 関数宣言の解析を実行しようとしています。入力パラメーターを解析するための私のルールは次のとおりです。

arg : 'const'? 'unsigned'? t=STRING m=TYPEMOD? n=STRING 
 -> ^(ARG $n $t $m?) ;

STRING  : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'::')+ ;

TYPEMOD 
 : ('*' | '&')+ ;

問題は、次のようなものを渡そうとしていることです:

int *param

「int」と t を一致させますが、TYPEMOD をスキップし、n と一致させようとすると * は不要であるという例外をスローし、「param」と n を一致させます。TYPEMOD トークンをスキップして一致しないのはなぜですか?

前もって感謝します!

編集:

これが私の空白ルールです(コメントルールも含めました)。クラス宣言、プロパティ、構造体などの他のものを解析すると、すべて正常に機能するようです。これらの TYPEMOD のものだけです...

COMMENT_LINE 
    :   '//' (~'\n')* '\n' { $channel = HIDDEN; } ;

COMMENT_BLOCK 
    :   '/*' .* '*/' { $channel = HIDDEN; } ;

NL      :   ('\r' | '\n')+ { $channel = HIDDEN; } ;

WS      :   (' '|'\t')+ { $channel = HIDDEN; } ;
4

1 に答える 1

1

マイナーな変更のみで、作業を続行するためにルールを次のように表示する必要があると思います。

 arg : 'const'? 'unsigned'? t=STRING m=typemod? n=STRING 
 -> ^(ARG $n $t $m?) ;

typemod : TYPEMOD+;

STRING  : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'::')+ ;

TYPEMOD 
 : '*'|'&' ;

STRING lexer ルールは変更しませんでしたが、arg および TYPEMOD ルールを変更し、新しいパーサー ルール typemod を作成しました。

そうそう、私は Java ターゲットを使用したので、これがうまくいくことを願っています。

これが役に立てば幸いです。幸運を祈ります。

于 2010-07-21T23:31:43.677 に答える