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)+ ;
(这是对您的意图做出的一些假设。)
要点,如果你希望WORD
s是单个标记,它们需要被定义为一个Lexer规则。
如果要为 Lexer 规则编写规则,可以定义 fragment
规则。这些规则可用于编写 Lexer 规则,但它们本身不会被识别为标记。
通过此处的更改,您应该能够在解析器规则中使用 WORD
,并将构成 WORD
的所有字符都放在一个令牌中。
我是 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)+ ;
(这是对您的意图做出的一些假设。)
要点,如果你希望WORD
s是单个标记,它们需要被定义为一个Lexer规则。
如果要为 Lexer 规则编写规则,可以定义 fragment
规则。这些规则可用于编写 Lexer 规则,但它们本身不会被识别为标记。
通过此处的更改,您应该能够在解析器规则中使用 WORD
,并将构成 WORD
的所有字符都放在一个令牌中。