【问题标题】:Grammar symbol attributes implementation in CC中的语法符号属性实现
【发布时间】:2012-03-13 01:12:40
【问题描述】:
我需要实现编译器(词法、语法和语义分析器)。
我已经实现了来自 flex++ 的词汇,来自手的语法(递归下降),
并且知道我正在研究语义(向现有解析器添加语义规则)。
我的问题是 - 我如何实现属性。
例如,对于生产:
TYPE -> integer
我需要添加语义规则:
TYPE.type = integer
所以这里我需要为 TYPE 创建一些结构,等等所有的语法符号。
那么我该如何实现这些结构呢?我是否需要为每个语法符号创建一些结构,并且它需要是全局文件范围?
附言也许它不是最好的编译器实现,它只是赋值的要求。
【问题讨论】:
标签:
c
compiler-construction
compiler-theory
【解决方案1】:
如果您为您的语言中的每个终端和非终端定义一个类型(通常是一个结构),这是最简单的。然后,(非)终结符的每次使用都可以访问该类型,并且属性的每次分配都与与(非)终结符关联的结构中的相应槽相对应。
我建议您在语法标记之后命名您的实现结构。因此,T 的属性结构的类型将是“T_attributes { ... }”
对于您的示例,“类型”将是 T_attributes 中的一个插槽。您在摘要中的意思大概是:
TYPE -> 'integer' ; -- 'integer is a keyword'
TYPE.type = "int"; -- the type of an 'integer' is "int"
鉴于您是手动执行此操作,您将手动编译属性分配以在树遍历命中 TYPE 节点时执行。