繁体   English   中英

Java Antlr4一阶逻辑语法

[英]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  ;

这似乎不足为奇。

根据您的语法, formulaexists若干个和forall子句后跟一个bidir 如果您跟踪bidir的生产, bidir很明显,它必须以negation开头,而必须以NOT开头。 因此,当您扫描formula ,必须看到以三个标记EXISTSFORALLNOT之一标记的子句。

您的negation需要包括它不是否定的可能性。 例如,您可以使NOT可选。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM