SQLite源代码parse.y - nm

时间:2017-03-21 02:22:39

标签: sqlite compiler-construction grammar bison bnf

我正在阅读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文档说

  

通常,非终端的数据类型是指向根的指针   一个解析树结构,包含有关它的所有信息   非末端

%type   expr  {Expr*}
  1. 我是否应该理解{Token}实际上代表一个句法分组,这是一个非终端令牌,“是一个包含所有...的解析树结构”?

  2. 同样是什么是nm短片,它只是“名字”?

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

1 个答案:

答案 0 :(得分:2)

  1. 不,您应该理解Token是用于nm的语义值的C对象类型。 (它在sqliteInt.h中定义,由指向非空终止字符数组的指针和该数组的长度组成。)
  2. nm定义正上方的注释以"名称"开头,这绝对告诉我nm是&#34的缩写;姓名",是的。这也与它的语义类型一致,如上所述,它基本上是一个名称(或至少是一串字符)。

  3. 所有柠檬制作都以点结尾。它告诉lemon生产结束的地方,就像分号表示C语言编译器的结尾是。这样可以更容易地解析连续的制作,否则解析器必须在前面看几个符号才能看到::=