用于字母数字字的ANTLR解析器,字母数字字之间可能有空格
首先,我尝试识别一个正常的词,下面的方法很好:用于字母数字字的ANTLR解析器,字母数字字之间可能有空格,antlr,antlr4,Antlr,Antlr4,首先,我尝试识别一个正常的词,下面的方法很好: grammar Test; myToken: WORD; WORD: (LOWERCASE | UPPERCASE )+ ; fragment LOWERCASE : [a-z] ; fragment UPPERCASE : [A-Z] ; fragment DIGIT: '0'..'9' ; WHITESPACE : (' ' | '\t')+; 就在我在“myToken”下面添加解析器规则的时候,甚至我的单词标记也没有被输入字符串识别
grammar Test;
myToken: WORD;
WORD: (LOWERCASE | UPPERCASE )+ ;
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment DIGIT: '0'..'9' ;
WHITESPACE : (' ' | '\t')+;
就在我在“myToken”下面添加解析器规则的时候,甚至我的单词标记也没有被输入字符串识别为“abc”
有人知道为什么吗?这是因为ANTLR的lexer匹配“先到先得”。这意味着它将尝试将给定的输入与第一个指定的(在源代码中)规则匹配,如果其中一个可以匹配输入,它将不会尝试将其与其他规则匹配 在您的情况下,
ALPHA\u NUMERIC\u WS
确实与WORD
(及更多)匹配相同的内容,并且因为它是在WORD
之前指定的,WORD
永远不会用于匹配输入,因为没有任何输入可以被WORD
匹配,而第一次处理的字母数字\WS
无法匹配。(这同样适用于WS
和数字
)规则
我猜您想要的不是创建一个字母数字\u WS
-标记(通过将其指定为lexer规则来实现),而是将其作为一个解析器规则,这样就可以从另一个parsre规则引用它,从而允许任意序列的单词
s、数字
s和WS
s
因此,你应该这样写:
alpha_numweric_ws: ( WORD | DIGIT | WHITESPACE)+;
如果您确实想要创建相应的标记,您可以删除以下规则,或者您需要考虑词法分析器的工作是什么,以及在词法分析器和解析器之间的界限在哪里(您需要重新设计语法以使其工作)。这是因为ANTLR的词法分析器匹配“先到先服务”。这意味着它将尝试将给定的输入与第一个指定的(在源代码中)规则匹配,如果其中一个可以匹配输入,它将不会尝试将其与其他规则匹配 在您的情况下,
ALPHA\u NUMERIC\u WS
确实与WORD
(及更多)匹配相同的内容,并且因为它是在WORD
之前指定的,WORD
永远不会用于匹配输入,因为没有任何输入可以被WORD
匹配,而第一次处理的字母数字\WS
无法匹配。(这同样适用于WS
和数字
)规则
我猜您想要的不是创建一个字母数字\u WS
-标记(通过将其指定为lexer规则来实现),而是将其作为一个解析器规则,这样就可以从另一个parsre规则引用它,从而允许任意序列的单词
s、数字
s和WS
s
因此,你应该这样写:
alpha_numweric_ws: ( WORD | DIGIT | WHITESPACE)+;
如果您确实想要创建相应的标记,您可以删除以下规则,或者您需要考虑词法分析器的工作是什么,以及在词法分析器和解析器之间的界限在哪里(您需要重新设计语法以使其工作)