parsing - 语法、堆栈、终端符号和标记

标签 parsing token symbols

解析器(或编译器)通常包含分词器,它可以识别作为输入的字母表中符号系列中的某些分词类型。

这样我们的解析器只读取 token 流。不是原始字符。

然而,在语法层上,人们谈到终结符和非终结符。但不是代币。

这意味着语法和堆栈(假设我们使用的是 LL(k) 或 LR 系列解析器)都由终结符和非终结符组成。但是,我们也假设它是有道理的,同样从语法角度讲符号时,也可以使用终端符号的标记类型。

是否有关于如何表示文法符号(尤其是终结符)的约定,以及终结符通常是“类型化”的吗?

我的猜测是接口(interface)的多重继承——但只有一个 TokenType 类,因此接口(interface)实际上没有任何意义。使用 IGrammarSymbol,您至少有两个类,Terminal 和 Nonterminal,它们可以实现该接口(interface)。

此致

最佳答案

每个文法符号,无论是终结符还是非终结符,在逻辑上都是解析器中的一个(不同的)类。不同的“终端”类或不同的“非终端”类之间没有内在的相似性,将这些类分组为从“终端”和“非终端”基类派生的继承结构毫无意义。

文法符号的每个具体实例都与零个或多个属性相关联。属性的语义和类型由符号的类型决定。从同一基类型派生出两个恰好具有相同(或相似)属性集合的不同语法符号类是有意义的。例如,不同类型的表达式运算符非终结符可能都派生自某些基 Expression 类。载值终结符(标识符和文字常量)也可能派生自此类,但纯句法终结符更有可能派生自没有语义属性的类。 (它可能仍然具有与源代码位置相关的句法属性。乍一看似乎这些句法属性仅适用于终端,但对于非终端也具有句法属性通常很方便。)

关于parsing - 语法、堆栈、终端符号和标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47112375/

相关文章:

c - 我对符号表和重定位表的使用的理解是否正确?

c++ - 用于在 Windows 中调试的符号表

r - R:使用xpath过滤节点

java - 不同长度的字符串解析

Angular 应用程序中的 API token 安全

ios - 在正百分比变化前添加 + 号

linux - linux下解析文件

javascript - 为什么 netsniff.js 将 javascript 错误打印到输出中?

c - 根据分隔符分割一串整数并转换为int类型?

string - 使用 JavaCC 解析字符串