当前位置:首页 » 编程软件 » 编译符号无用依赖

编译符号无用依赖

发布时间: 2022-08-21 16:43:45

编译原理全部的名词解释

书上有别那么懒!。。。。
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的。):文法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)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。

给我分数啊。。。

Ⅱ 很多编译程序采用的基于属性文法的语义处理过程称为什么

首先,我们给出语义属性的定义。
定义 5.1一文法符号X∈VN∪VT的语义性质称为该文法符号的语义属性(Semantic Attributes),简称为属性。我们用A(X)表示X的所有属性的集合。每个属性表示X的一个特定性质,并可任意指定其取值范围。下面,我们将用X.a表示A(X)中的属性a。
由定义5.1可知,文法符号的属性就是它的语义性质。属性可表征诸如数、符号串、类型、存储空间和其它需表征的实体。就终结符号而言,它至少有一种属性,即词文。当然,它还可能具有其它属性,例如,对3.2.1中所定义的无符号数,单词“123”就是它的词文;而其数值和类型(整型)是它的另外两个属性。一般来说,终结符号的属性是其内在性质;当然也有些属性将从其它符号的属性中获取。例如,变量标识符的类型属性,将从类型定义语句中获取,也就是说,它是通过语法树从其它符号的属性中获取的。对非终结符号而言,其属性之值均须从其它符号的属性经计算而得,或者说,是由其它符号的属性定义的。
可见,各个文法符号的属性之间,可能存在某种依赖关系,这种依赖关系可用属性规则(语义规则)来定义。
定义 5.2设p:X0→X1X2…Xn∈P是文法G的一个产生式,则与p相关联的属性规则集合
定义 5.3对每个产生式p:X0→X1X2…Xn∈P,设属性定义性出现的集合为
AF(p)={Xi.a|Xi.a=f(Xk1.ak1,Xk2.ak2,…,Xkm.akm)∈R(p),而0≤kj≤n}
若Xi是产生式左部的非终结符号(即i=0),则称属性Xi.a是综合属性(Synthesized Attributes);若Xi出现在产生式的右部(即1≤i≤n),则称Xi.a是继承属性(Inherited Attributes)。
如果在一棵语法树中将每个结点均视为由若干个域组成的记录(或结构),则可将其中的一些域用来存放相应文法符号诸属性之值,并可用属性来为这些域命名。通常我们将每个结点都标注相应属性值的语法树称为加注语法树(Annotated Syntax Tree)或染色树(Decorted Syntax Tree)。于是,由定义5.3可知:在加注语法树中,一个文法符号X在相应结点的综合属性之值,由其子结点的属性和(或)X的其它属性,通过相关属性规则经计算而得,故综合属性的求值在语法树中是按自下而上的方式进行的;X的继承属性之值则由X的父结点和(或)其它兄弟结点来定义,故继承属性的求值将按自上而下的方式进行。
在引入属性的概念之后,我们就可以定义属性文法了。
定义 5.4属性文法AG是一个形如
AG=(G,A,R,B)
的四元组,其中:G=(VN,VT,P,S)是已简化的前后文无关文法;A=∪X∈VA(X)是属性的有限集合;R=∪p∈PR(p)是属性定义规则的有限集;而B=∪p∈PB(p)是条件的有限集合,B(p)用于描述使规则R(p)有效的条件(请注意,并非每条规则R(p)都必须有条件B(p)。若B(p)缺省,则意味着无条件使用该规则);且同时满足:
(1) 对G中任意两个不同的文法符号X和Y而言,属性集合A(X)和A(Y)不相交,即
A(X)∩A(Y)=(X≠Y)
(2) 在G的任意一个语法树中,对文法符号X的每一次出现,可用于计算X的每个属性Xa(Xa∈A(X))之值的规则至多有一条。
由定义5.4可知,属性文法实际上就是对前后文无关文法的一种拓广。另外,定义还表明,每个产生式中的任一文法符号的属性计算规则只能是惟一的,且任一文法符号的综合属性集与继承属性集不相交,即
AS(X)∩AI(X)=
其中:
AS(X)={X.a|p:X→α∈P,X.a∈AF(p)}
AI(X)={X.a|q:Y→μXυ∈P,X.a∈AF(q)}
下面,我们以一个简单赋值语句的文法为例,来说明属性文法的应用。为便于理解,我们用一英语单词(或词组)而不再像前几章那样用字母表示文法符号。并且约定,用大写字母开头的符号为非终结符号,而用小写字母开头的符号为终结符号。

Ⅲ 在附加依赖项里面已经添加了相应的lib文件,为什么编译链接的时候还是提示无法解析的外部符号

我在vs2008环境下面遇到了这个问题
总算自己解决了
如果选择的是win32而非x64配置,对应的库目录一定要设置到x86而非x64
在win32配置下使用x64 directx 库就会出现这种情况
解决方法:
假设directx目录为 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\
则对于win32配置
项目->属性->C/C++->常规->附加包含目录 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include
项目->属性->链接器->常规->附加库目录 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86
然后选择全部重新编译
我就是这样解决了这个问题

Ⅳ 头文件预编译用什么

#号是官方定义的,用于和其他类型区别的,不用多考虑,你就看看我给你的链接看看官方的说法
条件编译符号#define ???
#if、#elif、#else 和 #endif 指令提供的条件编译功能是通过预处理表达式和条件编译符号来控制的。
conditional-symbol:(条件符号:)
除 true 和 false 外的任何标识符或关键字
条件编译符号有两种可能的状态:已定义的或未定义的。在源文件词法处理开始时,条件编译符号除非已由外部机制(如命令行编译器选项)显式定义,否则是未定义的。当处理 #define 指令时,在指令中指定的条件编译符号在那个源文件中成为已定义的。此后,该符号就一直保持已定义的状态,直到处理一条关于同一符号的 #undef 指令,或者到达源文件的结尾。这意味着一个源文件中的 #define 和 #undef 指令对同一程序中的其他源文件没有任何影响。
当在预处理表达式中引用时,已定义的条件编译符号具有布尔值 true,未定义的条件编译符号具有布尔值 false。不要求在预处理表达式中引用条件编译符号之前显式声明它们。相反,未声明的符号只是未定义的,因此具有值 false。
条件编译符号的命名空间与 C# 程序中的所有其他命名实体截然不同。只能在 #define 和 #undef 指令以及预处理表达式中引用条件编译符号。
1

Ⅳ C#声明符号

2.5.3 声明指令
声明指令用于定义或取消定义条件编译符号。

pp-declaration:(pp 声明:)
whitespaceopt # whitespaceopt define whitespace conditional-symbol pp-new-line(空白可选 # 空白可选 define 空白 条件符号 pp 新行)
whitespaceopt # whitespaceopt undef whitespace conditional-symbol pp-new-line(空白可选 # 空白可选 undef 空白 条件符号 pp 新行)
pp-new-line:(pp 新行:)
whitespaceopt single-line-commentopt new-line(空白可选 单行注释可选 新行)
对 #define 指令的处理使给定的条件编译符号成为已定义的(从跟在指令后面的源代码行开始)。类似地,对 #undef 指令的处理使给定的条件编译符号成为未定义的(从跟在指令后面的源代码行开始)。

源文件中的任何 #define 和 #undef 指令都必须出现在源文件中第一个“标记”(第 2.4 节)的前面,否则将发生编译时错误。直观地讲,#define 和 #undef 指令必须位于源文件中所有“实代码”的前面。

示例:

复制代码
#define Enterprise
#if Professional || Enterprise
#define Advanced
#endif
namespace Megacorp.Data
{
#if Advanced
class PivotTable {...}
#endif
}是有效的,这是因为 #define 指令位于源文件中第一个标记(namespace 关键字)的前面。

下面的示例产生编译时错误,因为 #define 指令在实代码后面出现:

复制代码
#define A
namespace N
{
#define B
#if B
class Class1 {}
#endif
}#define 指令可用于重复地定义一个已定义的条件编译符号,而不必对该符号插入任何 #undef。下面的示例定义一个条件编译符号 A,然后再次定义它。

复制代码
#define A
#define A#undef 指令可用于取消定义一个本来已经是未定义的条件编译符号。下面的示例定义一个条件编译符号 A,然后两次取消定义该符号;第二个 #undef 没有作用但仍是有效的。

复制代码
#define A
#undef A
#undef A

Ⅵ C语言中,“$”符号有什么用啊

$操作系统的处理符号,有时候跟系统通信的时候要用上,比如在UNIX理编译某个文件可以用以下命令:$ CC pn.c

Ⅶ 用Vs编译DriectDraw,总是说“无法解析的外部符号 _DirectDrawCreateEx@16“,求解答

一般出现LNK2019错误都是库文件没添加造成的。
项目--》属性--》配置属性--》链接器-》输入--》附加依赖项 在其中加入所需库文件,注意把库文件写进去,每个库文件后加分号,同时在“链接器--》常规--》附加库目录”中填入相应库所在目录。

Ⅷ 编译原理这个符号表示什么 如图~~~~

剪头上加一个星号:S-*->aPb
表示从S可以推出含有非终结符P的形如aPb的句型。
剪头上加一个加号:S-+->a
表示从S可以推出终结符a。

Ⅸ 编译dll时调用其他第三方dll,编译通过但链接时提示无法识别的外部符号

“编译后在Release中输出打包的DLL”这个说法是不对的,或者说,是不行的。如果使用了MFC的dll和其它第三方(包括自定义)DLL文件,那么需要发布的时候,就需要制作一个“软件安装包”,这儿软件安装包打包了EXE,dll和你需要的其它数据文件(具体打包什么是由你自己指定的),软件打包工具软件,VisualStudio自带了一个,叫做:InstallShieldforVC6。这个程序使用比较复杂(需要自编代码)也很灵活,简单的安装包制作软件也有,你可以网上搜索一下,很多。另外,如果说,你只需要打包MFC标准DLL,那么,就不是打包的问题了,很简单,在RELEASE编译模式设置(project菜单)中,选择MFC为静态库,那么编译之后的程序,就不需要拷贝MFC的标准DLL(或者vc环境)支持了。

热点内容
华为平板怎么储存服务器文件 发布:2025-02-06 12:49:21 浏览:481
php查询结果数组 发布:2025-02-06 12:31:05 浏览:716
怎样把照片压缩打包 发布:2025-02-06 12:15:19 浏览:498
如何编译java文件 发布:2025-02-06 12:05:58 浏览:237
九九乘法编程 发布:2025-02-06 12:05:05 浏览:519
台式机忘记开机密码怎么办 发布:2025-02-06 11:58:01 浏览:871
android刷新按钮 发布:2025-02-06 11:57:17 浏览:586
存储过程有输入参数和输出参数 发布:2025-02-06 11:55:32 浏览:99
成绩评选算法 发布:2025-02-06 11:42:51 浏览:997
数据库测试数据 发布:2025-02-06 11:31:05 浏览:824