sqlite - SQLite源代码parse.y-nm

标签 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*}



我是否应该理解{Token}实际上代表一个语法分组,它是一个非终结符,“是包含所有内容的解析树结构。”?
nm在这方面的简称是“名称”吗?
每个nm(A)声明结尾处的句号(点.)是什么?

最佳答案

不,您应该了解Token是用于nm s语义值的C对象类型。
(它在sqliteInt.h中定义,由指向非空终止字符数组的指针和该数组的长度组成。)
nm定义上方的注释以“名称”开头,这无疑向我暗示nm是“名称”的缩写,是的。如上所述,这也与它的语义类型一致,该语义类型基本上是一个名称(或至少一个字符串)。
所有柠檬生产都以点结尾。它告诉柠檬生产的结尾在哪里,就像分号指示C编译器语句的结尾在哪里。这使得解析连续的作品更加容易,因为否则解析器将不得不向前看几个符号才能看到::=

关于sqlite - SQLite源代码parse.y-nm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917328/

相关文章:

python - 使用 SQLAlchemy 继承参数的 SQLite 和 Postgres 部分索引支持

compiler-construction - 程序中的标识符会发生什么?

parsing - Go 使用 Go 解析自身?

java - Antlr 解析器规则无法匹配指定的词法分析器规则

c# - 编译/优化后如何查看 C# 代码?

regex - 无法匹配Alex语法中的单个字符

java - 带有 sqlite 驱动程序的 Jar 可执行文件

android - 为什么我的异常处理程序不会捕获 Android SQLite 插入错误?

sql - 给定一列有效日期,是否有 SQL 语句可以将其转换为日期范围?

c++ - "g++"和 "c++"编译器