我正在嘗試為 Prolog 解釋器撰寫語法。當我在像“father(john,mary)”這樣的輸入上從命令列運行 grun 時,我收到一條訊息說“'father(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
;
uj5u.com熱心網友回復:
詞法分析器將始終為任何輸入生成相同的標記。詞法分析器不會“監聽”決議器試圖匹配的內容。詞法分析器應用的規則非常簡單:
- 嘗試匹配盡可能多的字符
- 當 2 個或更多詞法分析器規則匹配相同數量的字符時,讓首先定義的規則“獲勝”
由于第二條規則,該規則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://www.uj5u.com/net/383603.html
