我正在尝试在Antlr中为命题逻辑创建一个BNF语法,但我不断收到错误:
java.lang.NoSuchFieldError:offendingToken
由于没有显示行号,我不知道错误在哪里。构建成功,但是当我输入示例输入时,树停在句子处,即BNF中定义的第一个项目。
这是我的BNF:
grammar Grammar;
options {
language = Java;
output = AST;
ASTLabelType=CommonTree;
}
@header {
package antlr;
}
@members {
}
@lexer::header { //lexer
package antlr;
}
@lexer::members {
}
sentence: atomicsentence | complexsentence;
atomicsentence: 'T' | 'F' | symbol;
complexsentence: unop sentence | sentence binop sentence | (sentence);
unop: 'NOT';
binop: 'AND' | 'OR' | 'IMPLIES' | 'EQUIVALENT';
symbol: (LEXRULE)+;
LEXRULE: ('a'..'z')|('A'..'Z');
如果你在句子中注释出复合句,那么原子句部分就会起作用,直到它终止,因为没有EOF。我不确定这应该去哪里,因为将它添加到句子中是行不通的。
答案 0 :(得分:1)
(适用编辑)强>
我已经重构了你的语法,所以它应该像你想象的那样工作。
grammar Grammar;
options {
language = Java;
output = AST;
ASTLabelType=CommonTree;
}
tokens {
CODE;
}
@header {
package antlr;
}
@members {
}
@lexer::header { //lexer
package antlr;
}
@lexer::members {
}
code : sentence -> ^(CODE code);
sentence: UNOP? complexsentence (BINOP sentence)?;
atomicsentence: 'T' | 'F' | SYMBOL;
complexsentence: atomicsentence | '(' sentence ')';
UNOP: 'NOT';
BINOP: 'AND' | 'OR' | 'IMPLIES' | 'EQUIVALENT';
SYMBOL: LEXRULE+;
fragment
LEXRULE: ('a'..'z')|('A'..'Z');
答案 1 :(得分:1)
你的语法是递归的,ANTLR在尝试生成解析器时会提到:
[17:31:32]错误(210):以下几组规则是相互左递归的[complexsentence,sentence] [17:31:32]中止,因为以下规则是相互左递归的: [[T.complexsentence,index = 4,line = 15],[T.sentence,index = 2,line = 11]]
规则sentence
与complexsentence
匹配,complexsentence
规则与sentence
匹配。 ANTLR(v3)无法应对这种左递归规则。
你的语法的另一个问题是你没有针对whiate空格的词法规则,但你的示例输入"NOT p"
包含一个空格。
对于使用ANTLR的简单表达式解析器,请参阅: