我正在阅读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*}
我是否应该理解{Token}
实际上代表一个句法分组,这是一个非终端令牌,“是一个包含所有...的解析树结构”?
同样是什么是nm短片,它只是“名字”?
每个nm(A)声明结束的周期符号(点.
)是什么?
答案 0 :(得分:2)
Token
是用于nm
的语义值的C对象类型。
(它在sqliteInt.h
中定义,由指向非空终止字符数组的指针和该数组的长度组成。) nm
定义正上方的注释以"名称"开头,这绝对告诉我nm
是&#34的缩写;姓名",是的。这也与它的语义类型一致,如上所述,它基本上是一个名称(或至少是一串字符)。
所有柠檬制作都以点结尾。它告诉lemon生产结束的地方,就像分号表示C语言编译器的结尾是。这样可以更容易地解析连续的制作,否则解析器必须在前面看几个符号才能看到::=