Java antlr4上的精确字符串解析
我在解析文件时遇到问题。 情景如下: 在我要解析的文件中,我有如下值 ABC/123/TEST 前3个字母是某种标识符,这是我区分不同行的唯一方法 在语法文件中:Java antlr4上的精确字符串解析,java,antlr,antlr4,Java,Antlr,Antlr4,我在解析文件时遇到问题。 情景如下: 在我要解析的文件中,我有如下值 ABC/123/TEST 前3个字母是某种标识符,这是我区分不同行的唯一方法 在语法文件中: file1: str1?; str1 : NEWLINE identifier1 SLANT INTEGER SLANT ALPHA; INTEGER : [0-9]+; ALPHA : [A-Z]+; SLANT : '/'; NEWLINE : '/n'; identifier1 : 'ABC'; 在运行解析
file1: str1?;
str1 : NEWLINE identifier1 SLANT INTEGER SLANT ALPHA;
INTEGER : [0-9]+;
ALPHA : [A-Z]+;
SLANT : '/';
NEWLINE : '/n';
identifier1 : 'ABC';
在运行解析器时,解析器并没有将行标识符获取为ABC,而是给了我一些奇怪的错误
mismatched input 'ABC' expecting 'ABC'
如何根据antlr4中的精确字符串进行解析?问题在于,您的词法分析器将
ABC
词法化为ALPHA
,而不是标识符1
。原因如下:
identifier1
规则应该是一个lexer而不是解析器规则。因此,将其重命名为IDENTIFIER1
IDENTIFIER1
规则必须在ALPHA
规则之前声明,否则,ALPHA
将始终具有更高的优先级,ABC
将被解析为ALPHA
而不是identier1
。所以一定要把你的IDENTIFIER1
规则移到ALPHA
规则之上,然后一切都会好起来最后有空位吗?您是否尝试过使用==或.equals方法比较它们。我们能看到一些代码吗?原因是:产生最长令牌的第一条lexer规则获胜。在解析器规则
identifier1
中使用'ABC'
,隐式地在同一行为ABC
创建词法规则,即在更通用的ALPHA
之后,这会导致此规则永远无法匹配。因此:1。不要隐式地创建lexer规则;2.将lexer规则从特定到一般进行排序;3.永远不要让catchall lexer规则变得贪婪(比如CATCH_ALL:.+;
)非常感谢这些快速回复的家伙。我把识别器移到我的lexer,在ALPHA之前。对我来说很好干杯