我正试图为Prolog解释器编写语法。当我像“父亲(约翰,玛丽)”这样的输入从命令行运行grun时,我会收到一条消息:“在‘父亲’(john,john)没有可行的输入”,我不知道为什么。我试过在语法中重新排列规则,使用不同的入口点等,但仍然会出现同样的错误。我甚至不确定它是由我的语法引起的,还是其他类似于antlr本身的原因。有人能指出我的语法出了什么问题吗?或者想一想,如果不是语法,可能是什么原因?
我运行的命令是:
antlr4 -no-listener -visitor Expr.g4
javac *.java
grun antlr.Expr start tests/test.txt -gui
这是生成的解析树:

这是我的语法:
grammar Expr;
@header{
package antlr;
}
//start rule
start : (program | query) EOF
;
program : (rule_ '.')*
;
query : conjunction '?'
;
rule_ : compound
| compound ':-' conjunction
;
conjunction : compound
| compound ',' conjunction
;
compound : Atom '(' elements ')'
| '.(' elements ')'
;
list : '[]'
| '[' element ']'
| '[' elements ']'
;
element : Term
| list
| compound
;
elements : element
| element ',' elements
;
WS : [ \t\r\n]+ -> skip ;
Atom : [a-z]([a-z]|[A-Z]|[0-9]|'_')*
| '0'
;
Var : [A-Z]([a-z]|[A-Z]|[0-9]|'_')*
;
Term : Atom
| Var
;发布于 2021-12-13 20:12:28
lexer将始终为任何输入生成相同的标记。lexer不“侦听”解析器试图匹配的内容。lexer应用的规则非常简单:
。
由于第二条规则,规则Term将永远不会被匹配。将Term规则移至Var和Atom之上将导致后一条规则永远不匹配。解决方案:将Term规则“促进”为解析器规则:
start : (program | query) EOF
;
program : (rule_ '.')*
;
query : conjunction '?'
;
rule_ : compound (':-' conjunction)?
;
conjunction : compound (',' conjunction)?
;
compound : Atom '(' elements ')'
| '.' '(' elements ')'
;
list : '[' elements? ']'
;
element : term
| list
| compound
;
elements : element (',' element)*
;
term : Atom
| Var
;
WS : [ \t\r\n]+ -> skip ;
Atom : [a-z] [a-zA-Z0-9_]*
| '0'
;
Var : [A-Z] [a-zA-Z0-9_]*
;https://stackoverflow.com/questions/70340190
复制相似问题