我是Antl4的新手。我有一个antlr语法文件,它由类似于以下内容组成:
consonant : 'b' | 'c' | 'd' | 'f' ;
vowel : 'a' | 'e' | 'i' ;
connector : ':' | '-' ;
cseq : (consonant)+ ;
vseq : (vowel)+ ;
prefix : cseq vseq ;
word : (cseq vseq | cseq)+ ;
根据我的理解,即使这些行在文件的底部,它们仍然被视为规则。我的解析树捕获每个单独的字母,而不是将它们视为词汇项或单词。如何将这些规则更改为lexer语句?
需要记住几件事。
- 解析器规则是以小写字母开头的规则
- lexer规则是那些名称以大写字符开头的规则(相当常见的约定是将其全部大写(
- 如果在解析器规则中放入一个文本字符(所有规则都是解析器规则,因为它们以小写字符开头(,ANTLR将为这些字符合成一个TOKEN规则
由于你似乎希望一个单词成为一个词汇项目(即令牌(,你可以按照以下方式来做:
fragment CONSONANT : 'b' | 'c' | 'd' | 'f' ;
fragment VOWEL : 'a' | 'e' | 'i' ;
CONNECTOR : ':' | '-' ; // not sure what you intend for this
fragment CSEQ: CONSONANT+ ;
fragment VSEQ : VOWEL+ ;
PREFIX : CSEQ VSEQ ; // not sure what you intend for this
WORD : (CSEQ VSEQ | CSEQ)+ ;
(这对你的意图做出了相当多的假设。(
要点是,如果您希望WORD
s是单个令牌,则需要将其定义为Lexer规则。
如果要为Lexer规则编写规则,可以定义fragment
规则。这些规则可以用来组成Lexer规则,但它们本身不会被识别为令牌。
通过这里的更改,您应该能够在解析器规则中使用WORD
,并在单个Token中包含组成WORD
的所有字符。