パーサー ルールは小文字で始まり、レクサー ルールは大文字で始まります。AST として出力すると、パーサー ルール内の個々のトークンが個別のノードになるため、variable
ルールをパーサー ルールではなくレクサー ルールにする必要があります。
Variable : '$' CamelCaseIdentifier;
CamelCaseIdentifier : ('a'..'z') Identifier*;
Identifier : ('a'..'z' | 'A' .. 'Z' | '0'..'9')+;
しかし、このようにすると、入力123456
は としてトークン化されますがIdentifier
、これはおそらくあなたが望むものではありません。さらに、Identifier
ルールの名前はAlphaNum
. また、フラグメントルールを作成すると、レクサーがそれ自体でトークンを生成せず、他のレクサールール (ルールなど) に対してAlphaNum
のみ 's を使用するようになります。に一致するルールも必要な場合は、次のようにします。AlphaNum
CamelCaseIdentifier
Identifier
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';