我想在一阶逻辑中解析字符串并将它们转换为特定的类结构。例如,我想解析一个公式,如
∀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 ;
答案 0 :(得分:3)
这似乎并不令人惊讶。
根据您的语法,formula
是一些exists
和forall
条款,后跟bidir
。如果您追踪bidir
的作品,就会发现它必须以negation
开头,而且必须以NOT
开头。因此,在您扫描formula
时,您必须看到以三个令牌之一EXISTS
,FORALL
或NOT
为首的条款。
你的negation
需要包含它不是否定的可能性。例如,您可以选择NOT
。