1

質問があります。現在、約 1 時間探しています。特定の ANTLR レクサー ルールは、2 つ (またはそれ以上) のサブルールで構成されます。Lexer は個別の AST ノードを生成するようになりました。

例:

[...]
variable: '$' CamelCaseIdentifier;
CamelCaseIdentifier: ('a'..'z') Identifier*;
Identifier: ('a'..'z' | 'A' .. 'Z' | '0'..'9')+;
[...]

[...]$a[...]結果の与えられた入力で..., $, a, ...

これらのルールを分離してはならないことをレクサーに伝える方法を探しています。..., $a, ...

誰か助けてくれませんか?

4

3 に答える 3

2

パーサー ルールは小文字で始まり、レクサー ルールは大文字で始まります。AST として出力すると、パーサー ルール内の個々のトークンが個別のノードになるため、variableルールをパーサー ルールではなくレクサー ルールにする必要があります。

Variable            : '$' CamelCaseIdentifier;
CamelCaseIdentifier : ('a'..'z') Identifier*;
Identifier          : ('a'..'z' | 'A' .. 'Z' | '0'..'9')+;

しかし、このようにすると、入力123456は としてトークン化されますがIdentifier、これはおそらくあなたが望むものではありません。さらに、Identifierルールの名前はAlphaNum. また、フラグメントルールを作成すると、レクサーがそれ自体でトークンを生成せず、他のレクサールール (ルールなど) に対してAlphaNumのみ 's を使用するようになります。に一致するルールも必要な場合は、次のようにします。AlphaNumCamelCaseIdentifierIdentifier

Variable            : '$' (CamelCaseIdentifier | Identifier);
CamelCaseIdentifier : 'a'..'z' AlphaNum*;
Identifier          : 'A'..'Z' AlphaNum*;

// a fragment rule can't be used inside parser rules, only in lexer rules
fragment AlphaNum   : 'a'..'z' | 'A' .. 'Z' | '0'..'9';
于 2012-06-20T18:22:54.813 に答える
0

多分すべてのルール名を大文字にしようとしますか?

編集済み:例を使用して

grammar Dummy;

prog : VARIABLE*;

VARIABLE: '$' CAMELCASEIDENTIFIER;
CAMELCASEIDENTIFIER: ('a'..'z') IDENTIFIER*;
IDENTIFIER: ('a'..'z' | 'A' .. 'Z' | '0'..'9')+;


WS: (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN; };
于 2012-06-20T11:59:43.147 に答える