【问题标题】:BNF Grammar for propositional logic ANTLR命题逻辑 ANTLR 的 BNF 语法
【发布时间】:2013-01-17 13:00:22
【问题描述】:

我正在尝试在 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,但没有奏效。
  • 看看我编辑的答案

标签: java logic antlr bnf


【解决方案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');

【讨论】:

  • 对不起,我是 antlr 的新手,但是我的意思是 '(' sentence ')' 允许用户在输入中使用括号。但是,修复此问题后,仍然会产生相同的错误。
【解决方案2】:

您的语法是左递归的,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) 无法处理这种左递归规则。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多