命题逻辑ANTLR的BNF语法

时间:2013-01-17 13:00:22

标签: java logic antlr bnf

我正在尝试在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。我不确定这应该去哪里,因为将它添加到句子中是行不通的。

2 个答案:

答案 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]]

规则sentencecomplexsentence匹配,complexsentence规则与sentence匹配。 ANTLR(v3)无法应对这种左递归规则。

你的语法的另一个问题是你没有针对whiate空格的词法规则,但你的示例输入"NOT p"包含一个空格。

对于使用ANTLR的简单表达式解析器,请参阅: