Parsing 用属性语法修饰解析树

Parsing 用属性语法修饰解析树,parsing,grammar,parse-tree,Parsing,Grammar,Parse Tree,给定以下类型声明的属性语法,我需要能够为任何给定字符串生成解析树,例如“a,B:C;”,然后修饰树 我通常可以对简单的属性语法执行此操作,当属性明显时,但我无法解释out\u tab和in\u tab是什么。是的,这是我的家庭作业,我不是在寻求解决方案,我是在寻求关于这些属性的含义和可能的例子的指导,以帮助我 decl -> ID decl_tail decl.t := decl_tail.t decl_tail.in_tab := insert(decl,in_tab,

给定以下类型声明的属性语法,我需要能够为任何给定字符串生成解析树,例如“a,B:C;”,然后修饰树

我通常可以对简单的属性语法执行此操作,当属性明显时,但我无法解释
out\u tab
in\u tab
是什么。是的,这是我的家庭作业,我不是在寻求解决方案,我是在寻求关于这些属性的含义和可能的例子的指导,以帮助我

decl -> ID decl_tail
    decl.t := decl_tail.t
    decl_tail.in_tab := insert(decl,in_tab, ID.n, decl_tail.t)
    decl.out_tab := decl_tail.out_tab
decl_tail -> , decl
    decl_tail.t := decl.t
    decl.in_tab := decl_tail.in_tab
    decl_tail.out_tab := decl.out_tab
decl_tail -> : ID ;
    decl_tail.t := ID.n
    decl_tail.out_tab := decl_tail.in_tab

几年后,我希望你能很好地完成你的家庭作业:)

关于你的运动:

decl.t
decl\u tail.t
是合成的属性,它们复制类型名称(
ID.n
)并将其传递给解析树中的每个父产品

当到达一个产品
decl->ID decl\u tail
时,属性选项卡中的
保持一种标识符和类型之间的关系列表(不清楚属性选项卡中
的类型,但我们可以假设元组列表
(标识符;类型)
)。此属性是继承的,因此列表将开始在最上面的产品(最左边的标识符)中构造,然后继续从左到右构造它,并在最右边的标识符中完成它

然后当
decl\u tail->:ID时,完成列表的构建,因此使用合成属性(
out\u tab
)将结果再次合成到起始符号

这幅画是我画装饰过的树和图形的最佳作品:


蓝色箭头表示合成
t
属性,绿色箭头表示如何构造
列表中的
,红色箭头表示如何将结果合成为初始符号

理论上,您可以将tab属性作为值传递。实际上,tab相当于一个符号表,可以相当大。因此,您可能需要考虑在实践中传递标签作为符号表的引用。当您认为符号表本身很可能由子符号表组成时,这就更有意义了,您希望Tab所做的是引用最内层范围,假设每个范围都可以找到它的父范围。但我们处于“理论范围”。最初的帖子讨论了“属性语法”,这是一个纯粹的理论工具。作为限制,AG只能在属性之间进行赋值,并且只能调用没有副作用的函数。在全局符号表中写入是一个副作用,因此它超出了AGIt的范围。如果您坚持认为它不是AG,那么它可能超出了AGIt的范围,如果它不起作用的话。我们构建了完美的AG系统,这些系统没有这个函数属性,并且对于构建符号表非常有用,正如我所描述的,包括C++17。(见我的简历)。软件工程不是纯粹的理论;这是关于什么在实践中起作用。