:
一文法,S是文法的开始符号芹圆,αβδ是文法G的一个句型。如果有:S→αAδ且A→B则称β是句型αβδ相对于非终结符A的短语。特别,如有A→β则称β是句型αβδ相对于规则A→β的直接短语(也成简单短语)。一个句型的最左直接短语称为该句型的句柄。 4、从句型的推导树上很容易找出句型的短语和直接短语。设A是句型αβδ的某一子树的根,其中β是形成此子树的末端结点的符号串,则其中β是句型αβδ的相对于A的短语。若这个子树嫌芹塌只有一层分支,则β是句型αβδ的直接短语。最左边的直接短语是句柄。第四章词法分析单词的描述工具正规文法、正规式(正则表达式)、正规集、确定的有穷自动机(DFA)、不确定的有穷自动机(NFA)。课后练****题: 【说明:因为老师不让拷贝课件,所以课件都是由同学用手机拍摄下来的,因为投影效果渣的要命,再加上吊灯反光以及济南雾霾影响,所以照片成像都非常模糊,不得已才用经过处理的底片形式放送,敬请谅解。】* + 4 Presented by Rights Reserved. 5 Presented by Rights Reserved. 6 Presented by Rights Reserved. 7 Presented by Rights Reserved. 8 Presented by Rights Reserved. 9 Presented by Rights Reserved. 第五章自顶向下测语法分析方法 1、 给定上下文无关文法的产生式A→αA∈V N,α∈V *,若α→ε,则SELECT(A→α)=FIRST(α)。如果α→ε,则SELECT(A→α)=(FIRST(α)—{ε})∪FOLLOW(A)。 2、 一个上下文无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式,A→α,A→β, 满足SELECT(A→α)∩SELECT(A→β)=○。其中α、β不能同时→ε。 设有文法G[S],其句型的素短语是一个短语,它至少包含一个终结符,并除自身外不包含其他素短语,最左边的素短语称最左素短语。课后练****题: * *
B. 请问linux下,gcc编译程序的过程(从读取源文件到制作可执行程序中间所有过程,越详细越好)
gcc -S *.c 预处理+反汇编
C. 编译原理,证明下面文法G(s)是二义性的。
证明:
若文法中存在这样的句型,它具有两棵不同的语法树,则称该文法是二义性文法,二义性文法会引起歧义,应尽量避免。
(S + S)和(S * S)以及(i S * S)和(S + S i)都可以表示i+i*i,所以G(S):S -> S+S| S*S | (S) | i ;文法具有二义性。
D. 编译原理四——代码优化
1、基本块的划分方法:
3、DAG图实现基本块的优化
1、程序流图与循环
控制流程图就是有唯一首节点的有向图,用三元组G=(N,E,n 0 )表示(节点集,边集,首节点)节点集就是基本块集,有向边表示如下:基本块i出口语句不是转向语句或停语句,i与紧随其后的基本块j有有向边。或者i出口转向j入口语句。
2、循环:程序流图里的一个节点序列强连通,任意两个节点都有至少一条通路,它们中有且只有一个入口节点。(从序列外某节点有一条有向边引导它,或他是程序流图的首节点。
3、找循环:
必经节点集:从流图首节点出发,到n的任意通路都要经过m,m是n的必经节点,记为mDOMn;流图中结点n的所有必经节点的集合称为节点n的必经结点集,极为D(n)。
DOM的性质:自反性:流图中任意节点a,都有aDOMa。传递性:aDOMb,bDOMc则aDOMc。反对称性:aDOMb,bDOMa,a=b。DOM是一个偏序关系,任何节点n的必经节点集是一个有序集。
必经节点的求法:一定包括自己好吧。。。。。。必经节点集就是前驱节点必经节点集的交集加自己没准。
找回边:假设a b是流图中的一条有向边,如果bDOMa,则a b是流图中的一条回边。已知有向边n d是一条回边,则由它组成的循环就是由结点d、结点n以及有通路到达n但该通路不经过d的所有结点组成的。
4、可规约流图:当且仅当一个流图除去回边后,其余边构成一个无环路流图。性质:1. 图中任何直观环路都是循环。2. 找到所有回边可以对应找出所有循环。3. 循环或嵌套或不相交(可能有公共入口节点),goto语句不可跳入循环。
5、循环优化
E. 编译原理,递归下降子程序语法分析
没学过编译原理,看描述,是让写一个脚本执行软件。
终结符我查了下,就是不可再分的。比如iε。
输入是EGTSFI*/ε组成的字符串。
规则需要预处理。注意转意符在字符串中的效果。因为有/字符。
不会c或c++,只会c#。你可以到贴吧发帖。强人工智能吧 就挺好。算法吧有点乱。
最重要的,不要钱。
F. 编译原理:构造产生此语言的上下文无关文法G
对于文法G=(V, T, S, P),如果产生式的形式如下:
A -> xB
A -> x
其中A, B属于V,x属于T*,则称为右线性文法;相似的,如果产生式的形式如下:
A -> Bx
A -> x
则称为左线性文法。右线性文法和左线性文法统称为正则文法。
正则表达式的表达能力等价于正则文法,正则表达式的定义如下:
字母表中的任意字母是正则表达式,空串和空集也是正则表达式;
如果r, s是正则表达式,那么r|s, rs, r*, (r)也是正则表达式。
正则表达式的扩展:
r+:一个或多个重复
. :任意字符
[a-z]:字符范围
[^abc]:不在给定集合中的任意字符
r?:可选
正则表达式只能使用终结符(字母表中的字符),因而很容易变得复杂又难懂,实际中,经常使用正则描述,正则描述允许使用非终结符定义表达式,很像EBNF,但是它限制在未完全定义之前,不能使用非终结符,也就是说不允许递归或自嵌套。
像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法。
BNF的元符号:
::= 表示“定义为 ”,有的书上用-->
| 表示“或者”
< > 尖括号用于括起非终结符。
BNF的扩展EBNF:
可选项被括在元符号“[”和“]”中
重复项(零个或者多个)被括在元符号“{”和“}”中
仅一个字符的终结符用引号(")引起来,以和元符号区别开来
上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
BNF的扩展EBNF:
可选项被括在元符号“[”和“]”中
重复项(零个或者多个)被括在元符号“{”和“}”中
仅一个字符的终结符用引号(")引起来,以和元符号区别开来
上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
如上所述,上下文无关文法的递归性,对其分析方法也有很大影响。首先,用作识别这些结构的算法必须使用递归调用或显式管理的分析栈。其次,用作表示语言语义结构的数据结构现在也必须是递归的(通常是一颗分析树),而不再是线性的(如同用于词法和记号中的一样)了。
在程序设计语言中,通常用正则表达式描述词法规则。但是正则表示式的表达能力有限,她无法表达括号配对等语法形式,因而,需要引入表达能力更强的上下文无关文法。编译程序中常用正则文法表示词法,用上下文无关文法表示语法。那么程序语言中那些属于词法哪些属于语法呢?一个简单的办法,把所有能用正则文法表示的规则成为词法,即我们用尽可能的使用正则文法表示更多的东西,那些无法用正则表示式表示的成为句法,如C语言中的{ statement; }语法形式。语言中有些规则使用上下文无关文法仍然无法描述,例如变量的定义在使用之前,类型匹配等等,这些通常称为(静态)语义,它们在编译程序的静态语义检查阶段进行检测。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
G. 数控g代码控制机床 和 plc 控制的关系
数控机床中G代表是一种文本格式的代码,数控系统中G格式不能够直接被PLC辨别的,一般需要另外转换工具或者通过I/O等方式实现与PLC的对接,而PLC本身就是用普通的PLC指令,伺服电机接受的信号有些是PLC给的,有些是数控系统给的(一般是通过G代码控制运控卡来实现)
H. 编译原理全部的名词解释
书上有别那么懒!.
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序.解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句.
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序).
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的.):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的.
文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法.
LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)
第1个L:从左到右扫描输入串 第2个L:生成的是最左推导
1 :向右看1个输入符号便可决定选择哪个产生式
某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归
文法符号的属性:单词的含义,即与文法符号相关的一些信息.如,类型、值、存储地址等.
一个属性文法(attribute grammar)是一个三元组A=(G, V, F)
G:上下文无关文法.
V:属性的有穷集.每个属性与文法的一个终结符或非终结符相连.属性与变量一样,可以进行计算和传递.
F:关于属性的断言或谓词(一组属性的计算规则)的有穷集.断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性.
综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属
继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性.
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性.
(2) 终结符只有综合属性,没有继承属性,它们由词法程序提供.
在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递.
语法制导翻译:是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作.
语法制导翻译实现:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算.
中间代码(中间语言)
1、是复杂性介于源程序语言和机器语言的一种表示形式.
2、一般,快速编译程序直接生成目标代码.
3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现.
何谓中间代码:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成.
为何要转换成中间代码:(1)逻辑结构清楚;利于不同目标机上实现同一种语言.
(2)便于移植,便于修改,便于进行与机器无关的优化.
中间代码的几种形式:逆波兰记号 ,三元式和树形表示 ,四元式
符号表的一般形式:一张符号表的的组成包括两项,即名字栏和信息栏.
信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏.主栏的内容称为关键字(key word).
符号表的功能:(1)收集符号属性 (2) 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性.(3)作为目标代码生成阶段地址分配的依据
符号的主要属性及作用:
1. 符号名 2. 符号的类型 (整型、实型、字符串型等))3. 符号的存储类别(公共、私有)
4. 符号的作用域及可视性 (全局、局部) 5. 符号变量的存储分配信息 (静态存储区、动态存储区)
存储分配方案策略:静态存储分配;动态存储分配:栈式、 堆式.
静态存储分配
1、基本策略
在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址.
2、适用的分配对象:子程序的目标代码段;全局数据目标(全局变量)
3、静态存储分配的要求:不允许递归调用,不含有可变数组.
FORTRAN程序是段结构,不允许递归,数据名大小、性质固定. 是典型的静态分配
动态存储分配
1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术.
2、两种动态存储分配方式:栈式,堆式
栈式动态存储分配
分配策略:将整个程序的数据空间设计为一个栈.
【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间.
过程所需的数据空间包括两部分
一部分是生存期在本过程这次活动中的数据对象.如局部变量、参数单元、临时变量等;
另一部分则是用以管理过程活动的记录信息(连接数据).
活动记录(AR)
一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录.
构成
1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;
5、控制链;6、实参;7、返回地址
什么是代码优化
所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少.
优化原则:等价原则:经过优化后不应改变程序运行的结果.
有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小.
合算原则:以尽可能低的代价取得较好的优化效果.
常见的优化技术
(1) 删除多余运算(删除公共子表达式) (2) 代码外提 +删除归纳变量+ (3)强度削弱; (4)变换循环控制条件 (5)合并已知量与复写传播 (6)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块.
给我分数啊.
I. 编译原理四元式
四元式的一般形式为(op, arg1, arg2, result),其中:op为一个二元(也可以是零元或一元)运算符。arg1和arg2为两个运算对象,可以是变量、常数或者系统定义的临时变量名。result为运算结果。
第一步:T1=a*b,
第二步:T2=c*d,
第三步:T3=T2/e,
第四步:T4=T1-T3,
第五步:f=T4.
J. 数控系统怎么通过G代码控制电机运动的
简单的讲, 数控系统是数字控制系统简称,英文名称为Numerical Control System。计算机数控系统又称CNC,现在比较先进的数控系统都是CNC。
CNC系统由数控程序、输入装置、输出装置、计算机数控装置(CNC装置)、可编程逻辑控制器(PLC)、主轴驱动装置和进给(伺服)驱动装置(包括检测装置)等组成。
将G代码输入系统后,系统会转变成数字信号。这个比如我们将语言输入电脑后,也可以转变为数字信号。数字信号可以被数控系统识别执行。主轴的驱动比较简单,控制电机转速、正反转、准停即可。伺服系统是以机械运动的驱动设备,电动机为控制对象,以控制器为核心,以电力电子功率变换装置为执行机构,在自动控制理论的指导下组成的电气传动自动控制系统。
伺服系统可以控制伺服电机,伺服电机通常有三种,步进电机、直流伺服电机、交流伺服电机。控制方式也不太一样。伺服系统通过功率放大装置将数字信号转变为电信号,从而控制电动机的转动。伺服电动机又称执行电动机,在数控系统中,用作执行元件,把所收到的电信号转换成电动机轴上的角位移或角速度输出。伺服系统不同于普通电机,它接收到电信号后才进行微小的转动,从而可以精确的控制电机的角位移。
这是一个大体的工作流程。要想了解清楚还需要将数控技术学透彻。