语法,堆栈,终端符号和标记

时间:2017-11-04 15:35:51

标签: parsing token symbols

解析器(或编译器)通常包括一个标记器,它识别来自作为输入的字母表中的一系列符号中的某些标记类型。

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

然而,在语法层面,人们会谈到终端和非终结者。但不是令牌。

这意味着语法和堆栈(假设我们使用LL(k)或LR系列解析器)由终端和非终端组成。但是,让我们也假设,从语法的角度来看,当使用符号时,同样地使用终端符号的令牌类型也是有道理的。

是否有关于如何表示语法符号(尤其是终端)的约定,并且通常是"键入的终端" ?

我的猜测是接口的多重继承 - 但只有一个类TokenType,这样一个接口真的没有任何意义。使用IGrammarSymbol,您至少有两个类,Terminal和Nonterminal,它们可以实现该接口。

真诚的你

1 个答案:

答案 0 :(得分:0)

每个语法符号(终端或非终端)在逻辑上是解析器中的(不同)类。不同的"终端"之间没有固有的相似性。班级或不同的"非终端"类,并将这些类分组为从"终端"派生的继承结构。和"非终端"基类没什么意义。

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