自 1995 年以来,Prolog 就有了 ISO/IEC 标准:ISO/IEC 13211-1:1995。它还包含一个定义 Prolog 语法的语法,它由两个级别组成:
令牌级别:(6.4 令牌,6.5 处理器字符集)
这些是由正则表达式定义的,并像那个时代的许多语言一样使用最长的输入匹配/渴望消费者规则/贪婪匹配/最大咀嚼。用标准(6.4)的话来说:
令牌后面不能有这样的字符
将令牌的字符与这些
字符连接起来形成上述
语法所指定的有效令牌。注意事项1 这是急切的消费者规则:123.e 定义了令牌
123 . e。 layout text 有时需要
分隔两个令牌。
这种定义标记的方式对于起源于 1970 年代的编程语言来说是典型的。
token 级别对 Prolog 的语法特别重要,因为 term 或 read term 首先被定义为一系列 token:
term (* 6.4 *)
= { token (* 6.4 *) } ;
read term (* 6.4 *)
= term (* 6.4 *) , end (* 6.4 *) ;
许多令牌在开头都包含一个可选的layout text sequence。但永远不会到最后。另请注意,要确定结束时间(即完成时间段),需要先行查看下一个字符。在用 Prolog 编写的分词器中,这将通过 peek_char/1 来实现。
只有在在这个级别上识别出一个术语之后,实际的语法才会发挥作用。请参阅read_term/3 的 8.14.1.1 说明。当然,一个实现可能会做不同的事情,只要它表现得“好像”。
语法级别:(6.2 Prolog 文本和数据,6.3 术语)
这些定义依赖于完整的上下文无关语法形式以及一些上下文相关的约束。
一致性
关于实现的一致性,
see this table。 SWI 总是在许多特殊的方面有所不同:无论是在令牌级别还是在语法级别。甚至运算符语法 (for certain cases) 也与其他系统和标准不兼容。也就是说,某些术语的阅读方式不同。 Since SWI7, SWI now differs even for canonical syntax。试试writeq('.'(1,[])). 这应该会产生[1],但是SWI7 会产生一些错误。
对于符合标准的实现,请参阅sicstus-prolog(4.3 版)和gnu-prolog。