以下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;
然后为您提供正确的解析树:
我在解析简单语法时遇到问题。我认为问题在于存在相互冲突的规则。这是我要解析的文本:
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;
然后为您提供正确的解析树: