ANTLR4:我怎样才能从字母表中认出单词



我是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)+ ;

(这对你的意图做出了相当多的假设。(

要点是,如果您希望WORDs是单个令牌,则需要将其定义为Lexer规则。

如果要为Lexer规则编写规则,可以定义fragment规则。这些规则可以用来组成Lexer规则,但它们本身不会被识别为令牌。

通过这里的更改,您应该能够在解析器规则中使用WORD,并在单个Token中包含组成WORD的所有字符。

相关内容

  • 没有找到相关文章

最新更新