Java Antlr4第一阶逻辑语法

时间:2016-05-26 18:36:41

标签: java parsing antlr grammar antlr4

我想在一阶逻辑中解析字符串并将它们转换为特定的类结构。例如,我想解析一个公式,如

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

并将其转换为Universal类,其具有Variable字段和Formula 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  ;

1 个答案:

答案 0 :(得分:3)

这似乎并不令人惊讶。

根据您的语法,formula是一些existsforall条款,后跟bidir。如果您追踪bidir的作品,就会发现它必须以negation开头,而且必须以NOT开头。因此,在您扫描formula时,您必须看到以三个令牌之一EXISTSFORALLNOT为首的条款。

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