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

Parsing error with the default ANTLR4 grammar for the PDDL language

我对 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)))

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

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

其中一个问题是 (: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.