为什么ISO/IEC 13211-1:1995的技术勘误2忽略了"标记"规则中的"条形"?

Mic*_*sef 5 prolog iso-prolog

Cor.2(仅)说明以下关于第6.4条的内容:

6.4代币

添加为最后一个语法规则:

bar (* 6.4 *)
   = [ layout text sequence (* 6.4.1 *) ] ,
     bar token (* 6.4.8 *) ;
Run Code Online (Sandbox Code Playgroud)

当然另一种修改至6.4意图,即添加bar (* 6.4 *)到的定义token (* 6.4 *),这是在如下的ISO/IEC 13211-1:1995:

token (* 6.4 *)
   = name (* 6.4 *)
   | variable (* 6.4 *)
   | integer (* 6.4 *)
   | float number (* 6.4 *)
   | double quoted list (* 6.4 *)
   | open (* 6.4 *)
   | open ct (* 6.4 *)
   | close (* 6.4 *)
   | open list (* 6.4 *)
   | close list (* 6.4 *)
   | open curly (* 6.4 *)
   | close curly (* 6.4 *)
   | ht sep (* 6.4 *)
   | comma (* 6.4 *)
   ;
Run Code Online (Sandbox Code Playgroud)

这是Cor.2的一个小疏忽还是我被误解了?

fal*_*lse 4

这是使 ISO/IEC 13211-1:1995 更加一致的绝佳发现!是的,对于 Cor.2:2012,该规则token (* 6.4 *)应该通过进一步的替代方案来扩展

  | bar (* 6.4 *)
Run Code Online (Sandbox Code Playgroud)

另一方面,我认为遗漏或延期不会产生任何直接后果。但我同意这肯定会让标准更容易理解。

以下是一些论据,为什么即使没有进一步添加,当前的法典也很好:

1. 非终端栏已作为令牌包含在内

唯一(* 6.4 *)使用的地方是 term 输入内置谓词8.14.1 read_term/3, read_term/2, read/1, read/2 的子条款。其中,8.14.1.1 g) 内容如下:

g) 尝试解析C_Seq为标记序列
(6.4),
...

现在“标记序列(6.4)”并不是对特定非终结符的精确引用。6.4 下有各种非终结符,特别是最近添加的bar (* 6.4 *). 因此,可以引用(6.4)中定义的任何标记或标记序列。并且,定义标记序列的实际非终结符称为term (* 6.4 *),但“标记序列 (6.4)”和“术语 (6.4)”看起来完全不同。因此,我看不出有什么充分理由不将 bar 包含在read/1和 family读入的标记中。

此外,术语“语法”(6.3) 始终明确引用“条”(6.4)。

8.14.1.1 k 中还有另一个参考内容:

k) 解析C_Seq为读取项 (6.4) T.

这被理解为一个错误。 WDCor.3读取 8.14.1.1 k:

k) 解析C_Seq为读取项(6.4)(6.2.2) T.,

粗略地,read/1分两个阶段读取术语:在第一阶段,读入字符并立即将其解析为标记序列,直到遇到结束标记 (6.4.8)。因此,在拥有已经被解析为标记的字符序列之后,再次执行此操作是没有意义的。此外,这不会产生任何具体条款。只有6.2.2中read-term的定义才能确定T步骤k想要获取的term。6.4根本没有任何关于术语的内容,它只是令牌。

2. 即使 bar 不是标记序列的一部分,也可以读取术语

但即使不接受第一个参数,8.14.1.1 中的过程描述仍然能够在 8.14.1.1 g 中将字符序列解析C_seq为标记序列,因为标记ht sep (* 6.4 *)将同一组字符序列描述为bar (* 6.4 *)做。这些非终结符之间的唯一区别是ht sep专门用作列表表示法 (6.3.5) 的头尾分隔符,而bar用作中缀运算符。总而言之,步骤 g 和 k 现在a --> b | c.以不同的方式解析文本:步骤 g 解析" |"ht sep,步骤 k 解析为bar- 前提是有一个合适的运算符声明,例如

:- op(1105, xfy, '|').
Run Code Online (Sandbox Code Playgroud)