使用PDDL语言的默认ANTLR4语法解析错误

时间:2019-01-12 20:54:06

标签: antlr4

我对ANTLR比较陌生,所以请多多包涵。

我正在尝试解析有效​​的PDDL文件,似乎the given grammar出现了某种我似乎找不到的错误。

line 3:13 mismatched input 'at' expecting NAME
line 8:18 mismatched input 'at' expecting NAME
line 8:25 mismatched input '?a' expecting {'(', NAME, NUMBER}

产生错误的最小输入:

(define (domain foo)
(:types car place)
(:functions (at ?x - car) - place)

(:action move 
 :parameters (?a - place ?c - car)
 :precondition ()
 :effect (assign (at ?c) ?a)))

如果有用,可以在这里找到“官方” BNF: https://helios.hud.ac.uk/scommv/IPC-14/repository/kovacs-pddl-3.1-2011.pdf

我正在使用最新的稳定的antlr4(4.7.2)。我曾尝试生成Java和Python代码,但会输出相同的错误。

1 个答案:

答案 0 :(得分:2)

问题之一是(:functions (at ?x - car) - place)无法解析为functionsDef。看一下此规则及其组成的规则:

functionsDef
   : '(' ':functions' functionList ')'
   ;

functionList
   : ( atomicFunctionSkeleton+ ( '-' functionType )? )*
   ;

atomicFunctionSkeleton
   : '(' functionSymbol typedVariableList ')'
   ;

functionSymbol
   : NAME
   ;

如您所见,functionSymbol只能是一个名称,而输入at被标记为关键字,而不是NAME。如果at是有效的functionSymbol,则必须将其添加到其中:

functionSymbol
   : NAME
   | 'at'
   ;

或者,如果更多关键字是有效名称,则引入与其匹配的name规则:

functionSymbol
   : name
   ;

name
   : NAME
   | 'at'
   | 'start'
   | 'end'
   | ...
   ;

似乎- place应该与规则functionType相匹配:

functionType
   : 'number'
   ;

,但显然只能是关键字number。如果您添加'place'作为替代:

functionType
   : 'number'
   | 'place'
   ;

它将被正确解析。

假设输入(:functions (at ?x - car) - place)有效,则仅functionsDef的语法中就已经有2个错误。我会犹豫使用它。

编辑

对于解析器规则内的所有文字关键字(例如'at''begin''end'等),ANTLR都会在幕后创建标记。因此,它将与以下内容相同:

AT    : 'at';
BEGIN : 'begin';
END   : 'end';
...
NAME  : LETTER ANY_CHAR*;

因此,输入at将始终被标记为AT标记,而永远不会被标记为NAME标记。如果您希望at有时被识别为AT,而有时又被识别为NAME,请按照我之前的建议进行操作:引入一个名为name的解析器规则,并使其匹配NAME和所有关键字标记,并在解析器规则中使用name而不是NAME