我是ANTLR的新手,所以请耐心等待。
我试图解析一个有效的PDDL文件,但给定的语法似乎有一些我找不到的错误。
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代码,但它输出了相同的错误。
其中一个问题是(: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'
;
但这显然只能是关键字CCD_ 11。如果添加'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
。