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