【问题标题】:SQLite source code parse.y - nmSQLite 源代码 parse.y - nm
【发布时间】:2023-03-19 14:17:01
【问题描述】:

我正在阅读 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) 声明的句号(点 .)是什么?

【问题讨论】:

    标签: sqlite compiler-construction grammar bison bnf


    【解决方案1】:
    1. 不,你应该明白Token是一个C对象类型,用于nms的语义值。 (它在sqliteInt.h 中定义,由指向非空终止字符数组的指针和该数组的长度组成。)
    2. nm 定义上方的注释以“名称”开头,这绝对暗示我nm 是“名称”的缩写,是的。这也与其语义类型一致,如上,基本上是一个名称(或至少是一串字符)。

    3. 所有柠檬产生式都以点结尾。它告诉柠檬产生式的结尾在哪里,就像分号向 C 编译器指示语句的结尾在哪里一样。这使得解析连续产生式变得更容易,因为否则解析器必须先查看几个符号才能看到::=

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 2011-02-03
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      相关资源
      最近更新 更多