Cor.2(仅)说明以下关于第6.4条的内容:
6.4代币
添加为最后一个语法规则:
Run Code Online (Sandbox Code Playgroud)bar (* 6.4 *) = [ layout text sequence (* 6.4.1 *) ] , bar token (* 6.4.8 *) ;
当然另一种修改至6.4意图,即添加bar (* 6.4 *)
到的定义token (* 6.4 *)
,这是在如下的ISO/IEC 13211-1:1995:
Run Code Online (Sandbox Code Playgroud)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 *) ;
这是Cor.2的一个小疏忽还是我被误解了?
这是使 ISO/IEC 13211-1:1995 更加一致的绝佳发现!是的,对于 Cor.2:2012,该规则token (* 6.4 *)
应该通过进一步的替代方案来扩展
| bar (* 6.4 *)
Run Code Online (Sandbox Code Playgroud)
另一方面,我认为遗漏或延期不会产生任何直接后果。但我同意这肯定会让标准更容易理解。
以下是一些论据,为什么即使没有进一步添加,当前的法典也很好:
唯一(* 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根本没有任何关于术语的内容,它只是令牌。
但即使不接受第一个参数,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)