Ich möchte Strings in Logik erster Ordnung analysieren und sie in eine bestimmte Klassenstruktur umwandeln. Zum Beispiel möchte ich eine Formel wieJava Antlr4 Logikgrammatik erster Ordnung
∀x∃y∃z((R(x,y) ∨ Px)→(Qx→(Px∧Zx)))
und schalten Sie ihn in eine Universal-Klasse analysieren, die eine Variable-Feld und ein Formel quantifiedFormula Feld hat, die für den Rest der Formel steht. Ich habe Probleme mit der Grammatik. Wenn ich die Formel mit dem antlr analysieren Code generiert ich
line 1:11 extraneous input '(' expecting {'\u2200', '\u2203', '\u00ac'}
'\ U2200' ∀ ist, \ u2203 heißt ∃ und \ u00ac heißt ¬, die Negation Zeichen.
Das ist meine Grammatikdatei. Ich habe es nach der FOL.g-Datei zusammengestellt, die auf der Website von antlr3 gefunden wurde. Ich benutze jedoch antl4.
Grammatik 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 ;