JAVA文法bnf_关于java:BNF命题逻辑ANTLR的语法

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

好吧,请举例说明您的输入。

另外向我们显示您的语法的完整来源,包括标题

我添加了完整的语法。 我也尝试了各种输入,最简单的输入是NOT p,这不起作用。

看看我编辑的答案

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

[17:31:32] error(210): The following sets of rules are mutually left-recursive [complexsentence, sentence]

[17:31:32] Aborting because the following rules are mutually left-recursive:

[[T.complexsentence,index=4,line=15], [T.sentence,index=2,line=11]]

规则sentence与complexsentence匹配,而complexsentence规则又与sentence匹配。 ANTLR(v3)无法应付此类左递归规则。

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

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

ANTLR:有一个简单的例子吗?

使用ANTLR 3.3吗?

(编辑)

我已经重构了您的语法,因此它应该可以按您的预期工作。

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');

对不起,我是antlr的新手,但是是的,我的意思是(句子)允许用户在输入中使用方括号。 但是,使用此修复程序,仍会产生相同的错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值