ANTLR4:如何识别字母表中的单词?

ANTLR4: How can I recognize words from an alphabet?

我是 Antl4 新手。我有一个 antlr 语法文件,其中包含类似于以下内容的内容:

consonant : 'b' | 'c' | 'd' | 'f' ; 
vowel : 'a' | 'e' | 'i' ; 
connector : ':' | '-' ; 

cseq : (consonant)+ ; 
vseq : (vowel)+ ;

prefix : cseq vseq ;

word : (cseq vseq | cseq)+ ;

据我了解,即使这些行位于文件的底部,它们仍然被视为规则。我的解析树捕获每个单独的字母,而不是将它们视为词汇项或单词。如何将这些规则更改为词法分析器语句?

有几件事要记住。

  • 解析器规则是以小写字母开头的规则
  • lexer 规则是那些名称以大写字符开头的规则(相当普遍的惯例是让所有字母都大写)
  • 如果您将文字字符放入解析器规则中(您的所有规则都是解析器规则,因为它们以小写字符开头),ANTLR 将为这些字符合成一个 TOKEN 规则。

既然你想让一个词成为一个词项(即 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,并将构成 WORD 的所有字符都放在一个令牌中。