我对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代码,但会输出相同的错误。
答案 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
。