Lan*_*ard 7 grammar prolog iso-prolog
是否有一个prolog语言语法,或接近它的东西,通常用作参考?我正在使用SWI-prolog,所以对于那种味道会很好,否则一般的prolog语言语法/规范也可以.
自 1995 年以来,Prolog 就有了 ISO/IEC 标准:ISO/IEC 13211-1:1995。它还包含一个定义 Prolog 语法的语法,它由两个级别组成:
这些是由正则表达式定义的,并像那个时代的许多语言一样使用最长的输入匹配/热切消费者规则/贪婪匹配/最大咀嚼。用标准 (6.4) 的话来说:
令牌后面不应跟有字符,以便这种定义令牌的方式对于源自 1970 年代的编程语言来说是典型的。
将令牌的字符与这些
字符连接起来形成上述
语法指定的有效令牌。注意
1 这是急切的消费者规则:123.e定义令牌123 . e。layout text有时需要用A来
分隔两个标记。
记号级别对 Prolog 的语法特别重要,因为term, 或read term首先定义为记号序列:
term (* 6.4 *)
= { token (* 6.4 *) } ;
read term (* 6.4 *)
= term (* 6.4 *) , end (* 6.4 *) ;
Run Code Online (Sandbox Code Playgroud)
许多令牌layout text sequence在开始时包含一个可选项。但永远不会到最后。另请注意,要确定结束(即完成期),需要先行查看下一个字符。在用 Prolog 编写的标记器中,这将通过peek_char/1.
只有在这个级别上确定了一个术语后,实际的语法才会发挥作用。参见 8.14.1.1 说明read_term/3。当然,一个实现可能会以不同的方式做它,只要它表现得“好像”。
这些定义依赖于完整的上下文无关语法形式主义加上一些上下文敏感的约束。
至于实现的一致性,
请参见此表。SWI 总是在许多独特的方面有所不同:在令牌级别和语法级别。甚至运算符语法(在某些情况下)与其他系统和标准不兼容。也就是说,某些术语的读法不同。从 SWI7 开始,SWI 现在甚至对于规范语法也有所不同。试试writeq('.'(1,[])).这应该会产生[1],但 SWI7 会产生一些错误。
有关符合要求的实现,请参阅sicstus-prolog(版本 4.3)和gnu-prolog。