词法分析器规则的 docs 显示了词法分析器命令的以下示例
type(...)
lexer grammar SetType;
tokens { STRING }
DOUBLE : '"' .*? '"' -> type(STRING) ;
SINGLE : '\'' .*? '\'' -> type(STRING) ;
WS : [ \r\t\n]+ -> skip ;
我找不到
tokens { STRING }
的任何文档。tokens
部分定义了所谓的虚拟代币。它们是虚拟的,因为没有代表该标记的词法分析器规则。您可能还记得标记名称是从定义它们的词法分析器规则派生的。
然而,有时您需要更多差异化。例如,您有数字的词法分析器规则,但您想区分 SHORT、LONG、WORD 等。然后您可以为这些特殊值定义虚拟标记:
tokens { SHORT, LONG, WORD }
ANLTR 将把它们定义为代币类型。然后,您可以编写一个返回这些虚拟类型之一的数字规则。喜欢:
NUMBER: [0-9]+ -> { type = determineNumeric($text); };
注意:上面给出的代码相当具有象征意义。操作内容取决于您的目标语言。
默认情况下,词法分析器会分配标记值
NUMBER
捕获的数字,但通过该操作,您可以分配您想要的任何标记值。