是否有序言语言语法,或通常用作参考的接近它的东西?我正在使用 SWI-prolog,所以有一个适合这种风格的会很好,否则通用的 prolog 语言语法/规范也可以。
3 回答
自 1995 年以来,Prolog 就有了 ISO/IEC 标准:ISO/IEC 13211-1:1995。它还包含一个定义 Prolog 语法的语法,该语法由两个级别组成:
令牌级别:(6.4 令牌,6.5 处理器字符集)
这些是由正则表达式定义的,并像那个时代的许多语言一样使用最长的输入匹配/渴望消费者规则/贪婪匹配/最大咀嚼。用标准(6.4)的话来说:
令牌后面不应有字符,这样这种定义令牌的方式对于起源于 1970 年代的编程语言来说是典型的。
将令牌的字符与这些
字符连接起来形成上述
语法指定的有效令牌。注释
1 这是急切的消费者规则:123.e
定义令牌123 . e
。有时需要Alayout text
来
分隔两个标记。
记号级别对 Prolog 的语法特别重要,因为term
, 或read term
首先被定义为记号序列:
term (* 6.4 *)
= { token (* 6.4 *) } ;
read term (* 6.4 *)
= term (* 6.4 *) , end (* 6.4 *) ;
许多标记在开始时包含一个可选项layout text sequence
。但永远不会到最后。另请注意,要确定结束时间(即结束时段),需要先行查看下一个字符。在用 Prolog 编写的分词器中,这将通过peek_char/1
.
只有在这个级别上确定了一个术语之后,实际的语法才会发挥作用。请参阅 8.14.1.1 说明read_term/3
。当然,实现可能会有所不同,只要它表现得“好像”。
语法级别:(6.2 Prolog 文本和数据,6.3 术语)
这些定义依赖于完整的上下文无关语法形式以及一些上下文相关的约束。
一致性
至于实现的一致性,
请参见此表。SWI 总是在许多特殊的方面有所不同:无论是在令牌级别还是在语法级别。甚至运算符语法(在某些情况下)也与其他系统和标准不兼容。也就是说,某些术语的读法不同。自 SWI7 以来,SWI 现在甚至对于规范语法也有所不同。Try writeq('.'(1,[])).
This 应该 yield [1]
,但 SWI7 会产生一些错误。
有关符合要求的实现,请参见sicstus-prolog(4.3 版)和gnu-prolog。
特别是对于 SWI-Prolog,事情有点“复杂”。它从未严格遵守 ISO,当前的开发版本(SWI-Prolog 7 及更高版本)与 ISO 合规性相差甚远。开发版本是目前唯一“积极”维护的版本,这意味着很快您可能会期望错误不会从 SWI-Prolog 6 中删除。
至于参考,您将不得不阅读手册并希望弄清楚什么是正确的,什么是错误的。信息都在那里,即使它不是超级整齐的。
这是您可以开始的地方:
http://www.swi-prolog.org/pldoc/man?section=syntax
推荐的书籍:
http://www.swi-prolog.org/pldoc/man?section=intro
不幸的是,实际上是您无法完全规避的事情(如果有人证明我错了,我会很高兴)。至少获得其中列出的三个中的一个。例如,Sterling & Shapiro, 1986 就是一个很好的起点。http://www.learnprolognow.org/上的在线教程也很不错。
别的东西:在 Richard O'Keefe 的“The Craft of Prolog”中,您可以找到用 Prolog (10.7, pp 337-354) 编写的 Prolog 标记器的完整实现。我不知道这是否符合您的目的。
还有一些建议:如果您打算使用 SWI-Prolog,请努力安装当前的开发版本。在 Linux 上它相当容易(不知道它在实践中如何在 MacOS 上运行,但我怀疑它更复杂)。
至少,有 ISO 标准(参见其创建者页面)。