解析器规则以小写字母开头,词法分析器规则以大写字母开头。当您作为 AST 输出时,解析器规则中的每个单独的标记都将成为一个单独的节点,因此您需要将该variable
规则设为词法分析器规则而不是解析器规则:
Variable : '$' CamelCaseIdentifier;
CamelCaseIdentifier : ('a'..'z') Identifier*;
Identifier : ('a'..'z' | 'A' .. 'Z' | '0'..'9')+;
但如果你这样做,输入123456
将被标记为Identifier
,这可能不是你想要的。此外,该Identifier
规则最好命名为AlphaNum
。如果你为它制定一个片段规则,你确保词法分析器永远不会AlphaNum
在自己身上产生任何标记,而只会将AlphaNum
's 用于其他词法分析器规则(如你的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';