SQLite 源代码 parse.y - nm

SQLite source code parse.y - nm

我正在阅读 SQLite 的 grammar 并且对以下段落有一些疑问。

// The name of a column or table can be any of the following:
//
%type nm {Token}
nm(A) ::= id(A). 
nm(A) ::= STRING(A). 
nm(A) ::= JOIN_KW(A).

nm在程序中的使用相当广泛。 lemon parser 文档说

Typically the data type of a non-terminal is a pointer to the root of a parse-tree structure that contains all information about that non-terminal

%type   expr  {Expr*}
  1. 我应该理解{Token}实际上代表一个句法分组,它是"is a parse-tree structure that contains all.."的非终结符吗?

  2. 这里面的nm是什么的缩写,是不是就是"name"?

  3. 每个 nm(A) 声明结束的句号(点 .)是什么?

  1. 不是,你应该明白Token是一个C对象类型,用于nm的语义值。 (它在 sqliteInt.h 中定义,由指向非空终止字符数组的指针和该数组的长度组成。)
  2. nm 定义上方的注释以 "the name" 开头,这对我来说肯定表明 nm 是 [=29 的缩写=], 是的。那也符合它的语义类型,如上,基本就是一个名字(或者至少是一串字符)

  3. 所有柠檬作品都以点结尾。它告诉 lemon 产生式的结束位置,就像分号向 C 编译器指示语句结束的位置一样。这使得解析连续产生式变得更容易,否则解析器将不得不提前查看几个符号才能看到 ::=