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

使用PDDL语言的默认ANTLR4语法分析错误,antlr4,Antlr4,我对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 ca

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


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

其中一个问题是,
(:functions(at?x-car)-place)
不能被解析为
函数df
。请查看此规则及其组成规则:

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

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

atomicFunctionSkeleton
   : '(' functionSymbol typedVariableList ')'
   ;

functionSymbol
   : NAME
   ;
正如您所看到的,
functionSymbol
只能是一个名称,但是处的输入
被标记为关键字,而不是
名称
。如果
at
是有效的
functionSymbol
,则必须将其添加到该符号中作为替代:

functionSymbol
   : NAME
   | 'at'
   ;
functionType
   : 'number'
   | 'place'
   ;
或者,如果有更多的关键字是有效名称,则引入与之匹配的
名称
规则:

functionSymbol
   : name
   ;

name
   : NAME
   | 'at'
   | 'start'
   | 'end'
   | ...
   ;
并且似乎是
-位置
应该由规则
函数类型
匹配:

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

functionSymbol
   : NAME
   | 'at'
   ;
functionType
   : 'number'
   | 'place'
   ;
它将被正确解析

假设输入
(:functions(at?x-car)-place)
是有效的,那么对于
functions df
,该语法中已经有2个错误。我会犹豫使用它

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

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

因此,输入
at
将始终标记为
at
标记,而不是
名称
标记。如果您希望
at
有时被识别为
at
,有时被识别为
名称
,按照我之前的建议去做:引入一个名为
name
的解析器规则,让它匹配
name
和所有关键字标记,并在解析器规则中使用
name
,而不是
name

只是一个旁注,其中的语法是由用户提供的(不是来自ANTLR开发人员)。对这些贡献的语法没有审查程序。你使用的语法很可能是不完整/错误的。哦!我不知道。我会编辑这个问题,谢谢:)非常感谢你的时间和详细的回答,你解释的问题非常好。我要理解的是,为什么ANTLR选择将“at”标记为关键字而不是名称,因为我认为名称规则足以接受“at”作为名称。你能给我解释一下吗?@CatOsMandros正在查看我的编辑