0

命題論理のために Antlr で BNF Grammar を作成しようとしていますが、エラーが発生し続けます:

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

文中の complexsentence をコメントアウトすると、atomicsentence 部分は EOF がないため終了するまで機能します。文に追加してもうまくいかないので、どこに行けばいいのかわかりません。

4

2 に答える 2

1

あなたの文法は再帰的に残されています。これは、パーサーを生成しようとするときに ANTLR が言及しています。

[17:31:32] エラー (210): 次のルールのセットは相互に左再帰的です [complexsentence, 文] [17:31:32] 次のルールは相互に左再帰的であるため、中止します: [[T.complexsentence ,index=4,line=15], [T.sentence,index=2,line=11]]

ルールは にsentence一致しcomplexsentencecomplexsentenceそのルールは に一致しsentenceます。ANTLR (v3) は、このような左再帰規則に対応できません。

文法のもう 1 つの問題は、ホワイト スペースに対するレクサー ルールがないにもかかわらず、入力例に空白"NOT p"が含まれていることです。

ANTLR を使用した単純な式パーサーについては、以下を参照してください。

于 2013-01-17T16:36:03.853 に答える
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 に答える