以下antlr4语法有什么问题

What is the problem with the following antlr4 grammar

我在解析简单语法时遇到问题。我认为问题在于存在相互冲突的规则。这是我要解析的文本:

  redis 6.2.6-debian-10-r49 Running
  account-migrator 0.83.0 Pending 

这表示具有名称、版本和状态的服务。这是不起作用的语法:

main                : statusLine+;
statusLine          : serviceName versionNumber status;
serviceName         : SERVICE_NAME;
versionNumber       : VERSION_NUMBER;
status              : STATUS;

SERVICE_NAME        : [a-zA-Z-]+;
VERSION_NUMBER      : [a-zA-Z0-9-]+ ('.' [a-zA-Z0-9-]+)*;
STATUS              : [a-zA-Z]+;
WS                  : [ \n\t]+ -> skip;

我相信我的语法混淆了服务名称的状态,因为我的访问者在第一次访问时找不到任何状态,但第二次访问获得第一行的状态作为第二行的服务名称。

所以我的问题是,我该怎么做才能正确解析这些行?

问题是您有多个匹配相同输入的规则。 STATUS 可以匹配的所有内容,实际上都会被 SERVICE_NAME 匹配。看看这个解析树:

代币 STATUS 从未产生,但 Running 变成了 SERVICE_NAME 代币。

因此,不要尝试向词法分析器添加语义(通过使用不同的名称,因此对相同的输入具有不同的含义),而是使用通用的词法分析器规则:


main                : statusLine+;
statusLine          : serviceName versionNumber status;
serviceName         : IDENTIFIER;
versionNumber       : VERSION_NUMBER;
status              : IDENTIFIER;

IDENTIFIER:     [a-zA-Z-]+;
VERSION_NUMBER: [a-zA-Z0-9-]+ ('.' [a-zA-Z0-9-]+)*;

WHITE_SPACE: [ \u000B\t\r\n] -> skip;

然后为您提供正确的解析树: