Java antlr4上的精确字符串解析

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'; 在运行解析

我在解析文件时遇到问题。 情景如下:

在我要解析的文件中,我有如下值

ABC/123/TEST

前3个字母是某种标识符,这是我区分不同行的唯一方法

在语法文件中:

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之前。对我来说很好干杯