2016-05-26 15 views
0

一次論理で文字列を解析し、特定のクラス構造に変換したいと考えています。例えば、私は、このようなJava Antlr4一次論理文法

∀x∃y∃z((R(x,y) ∨ Px)→(Qx→(Px∧Zx))) 

ような式を解析し、変数フィールドを持つユニバーサルクラスと式の残りの略式quantifiedFormulaフィールドにそれを有効にします。私は文法に悩まされています。私はANTLRでその式がコードを生成し解析するとき、私は

line 1:11 extraneous input '(' expecting {'\u2200', '\u2203', '\u00ac'} 

'\ u2200は、' \ u2203 IS∃と\ u00ac IS¬、否定記号、∀で取得します。

これは私の文法ファイルです。私はantlr3サイトにあるFOL.gファイルに沿ってまとめました。私はantl4を使用しています。

文法FOL;

options{ 
    language=Java; 
    output=AST; 
    ASTLabelType = CommonTree; 
    backtrack=true; 
} 

tokens{ 
    PREDICATE, 
    FUNCTION 
} 

/*------------------------------------------------------------------ 
* PARSER RULES 
*------------------------------------------------------------------*/ 

condition: formula EOF ; 

formula 
:  (forall | exists)* bidir ; 
forall : FORALL VARIABLE ; 
exists : EXISTS VARIABLE ; 

bidir : implication (BIDIR implication)*; 

implication 
: disjunction (IMPL disjunction)*; 

disjunction 
: conjunction (OR conjunction)* ; 

conjunction 
: negation (AND negation)* ; 

negation 
: NOT (predicate | LPAREN* formula RPAREN*) ; 

predicate 
: PREPOSITION predicateTuple (PREDICATE PREPOSITION predicateTuple) 
| PREPOSITION ; 

predicateTuple 
: LPAREN term (',' term)* RPAREN ; 

term : function | VARIABLE ; 

function: CONSTANT functionTuple (FUNCTION CONSTANT functionTuple) 
| CONSTANT; 

functionTuple 
    : LPAREN (CONSTANT | VARIABLE) (',' (CONSTANT | VARIABLE))* RPAREN; 

/*------------------------------------------------------------------ 
* LEXER RULES 
*------------------------------------------------------------------*/ 
LPAREN: '('; 
RPAREN: ')'; 
FORALL: '\u2200'; 
EXISTS: '\u2203'; 
NOT:'\u00ac'; 
IMPL: '\u2192'; 
BIDIR: '\u2194'; 
OR: '\u2228'; 
AND: '\u2227'; 
EQ: '='; 


VARIABLE: (('q'..'z')) CHARACTER* ; 

CONSTANT: (('a'..'p')) CHARACTER* ; 

PREPOSITION: ('A'..'Z') CHARACTER* ; 

fragment CHARACTER: ('a'..'z' | 'A'..'Z' | '_') ; 

WS : (' ' | '\t' | '\r' | '\n')+ -> skip ; 

答えて

3

これは意外なようです。

あなたの文法によると、formulaexistsforallのいくつかの数字の後にbidirが続きます。 bidirのプロダクションをトレースすると、negationで始まり、次にNOTで始まる必要があることが明らかになります。したがって、formulaをスキャンしている間は、3つのトークンEXISTS,FORALL、またはNOTのいずれかの見出しの句を表示する必要があります。

negationには否定できない可能性があります。たとえば、NOTをオプションにすることができます。