语法制导定义 SDD

news/2024/11/17 18:42:18/

        语法制导定义SDD是对于 上下文无关语法CFG 的一个推广:

  • 将每个产生式和一组语义规则相关联,用来计算该文法产生式中每个文法符号的属性值。
  • 将每个文法符号和一个语义属性集合相关联。

        也就是说,SDD为CFG的每个文法符号设置了一个语义属性,对于给定的输入串x,SDD可以分析出语法分析树中每一个节点的属性值。

        问法符号的属性包括:综合属性和继承属性。

        所谓综合属性,指的是:分析数节点N上的非终结符A的综合属性只能通过N的子节点或者N本身的属性决定。

          

        比如说这里面的产生式E -> E1 +T. 对于这个产生式的语法分析树我们看出来,这里面E的val属性值只由他的子节点E1和T的属性值val决定。所以E的val就是一个综合属性。

        所谓继承属性,指的是N上的非终结符A的继承属性只能由N的父节点,N的兄弟节点和N本身的属性决定。

                                 

        比如上面的例子中,在产生式的语法分析树中我们能够看出,L的inh属性是由T的type属性决定的,而T是L的兄弟节点,所以这个是继承属性。

        我举一个例子:

        上图中表示每一个产生式对应的语义规则,可以看出这是一个加法和乘法的语义规则。通过上面的sdd就可以根据语义规则来计算语法分析树上各个节点的属性值了,以算术表达式求值 3*5+4n为例:

                                              

从上面语法分析树中的最下面的叶节点可以看出,数字的值lexval分别是3,5和4,那么一步一步向上,由语义规则中的F.val = digit.lexval可知,每个因子的值由数字的值决定,所以可以向上构建上层节点的值F.val分别是3,5,4. 在往上看,由T.val = F.val可知,终结符的val由因子的val决定,所以计算再上层的T.val也分别是3,5,4。再计算乘法和加法的终结符属性值,最终算出来E.val = 19 以及n。L为打印输出,最终输出了结果,语法分析树的各个节点的值就是这么自底向上算出来的。

 


http://www.ppmy.cn/news/272011.html

相关文章

大模型LLM

大模型LLM的1000篇文章总结 本文收集和总结了有关大模型LLM的1000篇文章,由于篇幅有限只能总结近期的内容,想了解更多内容可以访问:http://www.ai2news.com/, 其分享了有关AI的论文、文章、图书。 query NLP重铸篇之LLM系列(Anthropic LLM) …

什么蓝牙耳机性价比高?盘点1000以内性价比高的蓝牙耳机

近些年真无线市场发展可谓风生水起,层出不穷的真无线耳机让人眼花缭乱,怎样挑选可就成为了一个问题。我自己进入数码圈内也有小五年了,对于蓝牙耳机哪个好用这个话题还是有些经验的,接下来的五款蓝牙耳机是我为大家精心挑选的&…

性价比高一点的蓝牙耳机有哪几款?高性价比蓝牙耳机推荐

现如今,在人们的日常生活当中随处可见的都是蓝牙耳机,蓝牙耳机的出现也便利了人们的生活。那么,不了解蓝牙耳机的朋友,在众多的蓝牙耳机中如何选择一款适合自己的呢?接下来,我给大家推荐几款性价比高一点的…

线程,你是个什么?

线程的基本定义 线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程(Process)中,是进程中的实际运作单位。一个线程可以与同一进程中的其他线程共享进程的全部资源,包括内存、文…

C++的lambda表达式(匿名函数)

从C11开始,C也支持使用lambda表达式(匿名函数)。Lambda表达式是一种便捷的方式,可以定义一个函数对象,而无需使用显式的函数对象类型或函数指针语法。 C中的 lambda表达式的基本语法如下: [capture list]…

【玩转Linux操作】硬链接和软连接

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 欢迎大家访问“在下小吉.”(偷偷告诉你这个是我的大号哦&#…

1512C. Nastia and a Hidden Permutation

先确认出1的位置…n/2次 用每个值与1做 1 号运算…,n-1次 不会超过3*n/2次 如果数列有奇数个元素,此时如果1在最后一个位置就会被忽略掉 所以如果p没被赋值1就在最后一个位置上 //cyc #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,f…

CodeForces - 1512C和CodeForces - 1512D

CodeForces - 1512C 给一串包含0,1,?的字符串,并给出a,b。可以将字符串中的?改成0或者1.最终使字符串中有 a 个 0,b 个 1 ,并且字符串回文。 用a,b减去原字符串中有多少个0或1,再从两…