我目前正在尝试绘制此属性语法的属性流。
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
但我不明白insert (decl.in tab, ID.n, decl tail.t)
是什么意思
我的第一个假设是它类似于Python中的insert((函数
但据我所知,Python的insert()
需要两个参数,但在这个属性语法中,它需要三个参数decl.in tab, ID.n, decl tail.t
,所以我最初的假设显然是错误的
我对编译器设计很陌生,很难弄清楚一些以前从未见过的语义函数的含义。(例如ReduceTo()
(
这个insert (decl.in tab, ID.n, decl tail.t)
是什么意思
是否有这样的语义函数列表需要我了解或记忆?
猜测,目的是将指定类型的声明变量添加到符号表("tab"(中。
然而,为了分析属性流,您并不真正需要知道insert
的作用。您只需要知道它需要某些值(其参数(,因此这些属性必须可用,才能根据函数的返回值计算指定的属性。
属性语法没有预定义的语义函数,所以您不需要担心记住它们的列表。在特定属性语法应用程序中使用的特定语义函数将由该应用程序本身指定。