0

我正在尝试在 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 而终止。我不确定这应该去哪里,因为将它添加到句子中不起作用。

4

2 回答 2

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');
于 2013-01-17T13:04:31.297 回答
1

您的语法是递归的,ANTLR 在尝试生成解析器时提到了这一点:

[17:31:32] 错误(210):以下规则集相互左递归 [complexsentence, sentence] [17:31:32] 中止,因为以下规则相互左递归:[[T.complexsentence ,index=4,line=15], [T.sentence,index=2,line=11]]

规则sentence匹配 a complexsentence,而complexsentence规则又匹配 a sentence。ANTLR (v3) 无法处理这种左递归规则。

您的语法的另一个问题是您没有用于 whiate 空格的词法分析器规则,但您的示例输入"NOT p"包含一个空格。

有关使用 ANTLR 的简单表达式解析器,请参见:

于 2013-01-17T16:36:03.853 回答