[英]Java Antlr4 first order logic grammar
我想解析一阶逻辑中的字符串,并将它们转换为特定的类结构。 例如,我想解析一个公式,例如
∀x∃y∃z((R(x,y) ∨ Px)→(Qx→(Px∧Zx)))
并将其转换为通用类,该类具有“变量”字段和一个“公式quantifiedFormula”字段,该字段代表该公式的其余部分。 我在语法上有麻烦。 当我用antlr生成的代码解析该公式时,
line 1:11 extraneous input '(' expecting {'\u2200', '\u2203', '\u00ac'}
'\\ u2200'是∀,\\ u2203是∃,\\ u00ac是¬(否定符号)。
这是我的语法文件。 我将其放置在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 ;
这似乎不足为奇。
根据您的语法, formula
是exists
若干个和forall
子句后跟一个bidir
。 如果您跟踪bidir
的生产, bidir
很明显,它必须以negation
开头,而必须以NOT
开头。 因此,当您扫描formula
,必须看到以三个标记EXISTS
, FORALL
或NOT
之一标记的子句。
您的negation
需要包括它不是否定的可能性。 例如,您可以使NOT
可选。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.