属性
),代表与文法符号相关信 息,如类型、值、代码序列、符号表内容等语义规则
,对属性进行计算和传递综合属性
和 继承属性
综合属性
综合属性
如这样一个文法的,.val就是一个综合属性:每一个节点的综合属性val的值都由其一些子节点的值组成
继承属性
继承属性
如下面的文法的type属性,对于id的type的值是由其父节点继承而来的,这样描述了一个声明语句:
语义规则
,每条规则的形式为(f是一个函数): b : = f ( c 1 , c 2 , … , c k ) b:=f(c_1,c_2,…,c_k) b:=f(c1,c2,…,ck)依赖
于属性 c 1 , c 2 , … , c k c_1,c_2,…,c_k c1,c2,…,ck
综合属性
并且 c 1 , c 2 , … , c k c_1,c_2,…,c_k c1,c2,…,ck 是产生式右边文法符号的属性,或者继承属性
并且 c 1 , c 2 , … , c k c_1,c_2,…,c_k c1,c2,…,ck 是A或产生式右边任何文法符号的属性综合属性
,由词法分析器提供综合属性
也可有 继承属性
,文 法开始符号的所有继承属性作为属性计算前的 初始值产生式右边的继承属性
和 出现在产生式左边的综合属性
都必须提供一个计算规则。 属性计算规则中只能使用相应 产生式中的文法符号的属性。产生式左边的继承属性
和 出现在产生式右边的综合属性
不由所给的产生式的属性计 算规则进行计算,由其它产生 式的属性规则计算或者由属性 计算器的参数提供。测试:
综合属性
的值由 其子结点
和 它本身
的属性值确定如:
继承属性
由 其父结点、 其兄弟结点
和 其本身
的某些属性确定继承属性
来表示程序设计语言结构中的上下 文依赖关系很方便如
翻译
就是根据 语义规则
进行 计算
语法制导翻译法
输 入 串 → 语 法 树 → 按 照 语 义 规 则 计 算 属 性 输入串 \to 语法树 \to 按照语义规则计算属性 输入串→语法树→按照语义规则计算属性虚综合属性b
,这样把每一个语义规则都写成 b : = f ( c 1 , c 2 , … , c k ) b:=f(c_1,c_2,…,c_k) b:=f(c1,c2,…,ck) 的形式。通过树遍历的方法计算属性的值:
考虑属性的文法G(S),其中:
不断的用上一规则,检查每一个节点是否有为计算的属性:
语法制导翻译法
,直观上说就是为文法中每个 产生式配上一组语义规则,并且在语法分析的同时 执行这些语义规则抽象语法树(Abstract Syntax Tree,AST)
,在 语法树中去掉那些对翻译不必要的信息,从而 获得更有效的源程序中间表示
mknode(op,left,right)
建立一个运算符号结点,标号是op,两个域left和right分别指向左子树和右子树mkleaf(id,entry)
建立一个标识符结点,标号为id,一个域entry指向标识符在符号表中的入口mkleaf(num,val)
建立一个数结点,标号为 num,一个域val用于存放数的值
S-属性文法
:只含有综合属性综合属性
一个例子
一个属性文法称为 L-属性文法
,如果对于每个产生式 A → X 1 X 2 … X n A→X_1X_2…X_n A→X1X2…Xn ,其每个语义规则中的每个属性或者是 综合属性
,或者是 X i ( 1 ≤ i ≤ n ) X_i(1≤i≤n) Xi(1≤i≤n) 的一个 继承属性
且这个继承属性仅依赖于:
S-属性文法一定是L-属性文法
例如这样一个文法就不是L-属性文法:
语义规则
:给出了属性计算的定义,没有属性计算的次序等实现细节翻译模式
:给出使用语义规则进行计算的次序,把实现细节表示出来语义动作
),用花括号{ }括起来,插入到产生式右部的合适位置上 如把带加号和减号的中缀表达式翻译成相应的后缀表达式,对输入串使用上面的文法的处理:9-5+2
分析如下:
L-属性文法
本身就能确保每个动作不会引用尚未计算出来的属性综合属性
时:为每一个语义规则建立 一个包含赋值的动作,并把 这个动作放在相应的产生式右边的末尾
综合属性
又有 继承属性
,在建立翻译模式时就必须保证:
综合属性
只有在它所引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常可放在产生式右端的 末尾
一个消除左递归同时构造出新的翻译模式的例子:
此时进行分析时,语法分析和语义分析即可同时进行:
假设有翻译模式: A → A 1 Y { A . a : = g ( A 1 . a , Y . y ) } A → X { A . a : = f ( X . x ) } A → A_1Y\{A.a:=\color{blue}{g(A_1.a, Y.y)}\color{black}{\}}\\ A → X\{A.a:=\color{red}{f(X.x)}\} A→A1Y{ A.a:=g(A1.a,Y.y)}A→X{ A.a:=f(X.x)} 它的每个文法符号都有一个综合属性,用小写字母表示, g和f是任意函数。
在语法的左递归消除中,添加语义的步骤,为R添加两个属性,连接上下文的属性:
例如:左为没有消除左递归的翻译模式,右为消除左递归的翻译模式:
另一个消除的例子:
对每个非终结符A构造一个函数过程
A的属性实现为参数和变量
继承属性
:对A的每个 继承属性
设置为函数的一个 形式参数
综合属性
:实现为函数的返回值 (若有多个综合属性,打包成作为结构或记录记录返回 为了简单,我们假设每个非终结只有一个综合属性)属性
:实现为A对应的函数过程中的 局部变量
按照产生式右部从左到右的,对于 单词符号 (终结符)
、非终结符
和 语义动作
,分别实现
终结符X
,把x的值存入为X.x 设置的变量中。然后产生一个匹配X的调用,并继续 读入一个输入符号。非终结符B
,产生一个右边带有函数调用的 赋值语句 c = B ( b 1 , b 2 , … , b k ) c=B(b_1,b_2,…,b_k) c=B(b1,b2,…,bk) ,其中, b 1 , b 2 , … , b k b_1,b_2,…,b_k b1,b2,…,bk 是为B的 继承属性
设置的变量,c是为B的 综合属性
设置的变量。语义动作
,把动作的代码抄进分析器中,用代 表属性的变量来代替对属性的每一次引用。一个例子:
R → a d d o p T R ∣ ε R→addopTR|ε R→addopTR∣ε 的递归下降分析过程:
(end)
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数