
编译原理
文章平均质量分 58
Goncely
学习学习不断学习
展开
-
乔姆斯基文法
乔姆斯基文法体系共分为4类: 0型文法:也叫短语结构文法或无限制文法,其描述能力相当于图灵机,可使用任何的语法描述形式; 1型文法:也叫上下文有关文法,其描述能力相当于线性有界自动机,语法形式如下: xSy -> xAy 也就是说,S推导出A是和上下文x, y相关的,即S只有在上下文x, y的环境中才能推导出A; 2型文法:也叫上下文无关文法,其描述能力相当于下推自动机,语法形式如下: S ->原创 2005-12-24 10:35:00 · 7798 阅读 · 0 评论 -
gcc研究笔记(三)libcpp中的宏扩展机制
1、libcpp中和宏相关的基础知识libcpp是gcc的C/C++语言预处理器,gcc将C/C++语言预处理器cpp以库的形式独立出来,故取名曰libcpp。libcpp的输出为预处理标记cpp_token序列,为了实现回退机制、预处理指令处理和宏扩展,libcpp分三层输出预处理标记cpp_token序列:a)_cpp_lex_direct:这是预处理标记序列输出的第一层,它直接原创 2007-04-14 18:14:00 · 3787 阅读 · 1 评论 -
gcc研究笔记(二)cp和cpplib的接口
1 调用接口cp_lexer_get_preprocessor_token: // in cp/ parser.c,C++分析器 => c_lex_with_flags => 标记C++关键字 c_lex_with_flags: // in c-lex.c,C语言词法分析 => cpp原创 2006-11-14 22:50:00 · 5115 阅读 · 0 评论 -
gcc研究笔记(一)tree是什么
在gcc中,几乎所有的东西都是用树结构串起来的,从而形成抽象语法树。tree可以看作是指向树节点的指针,所有的树节点都有一个共同的基类:tree_common。在文件coretypes.h中,tree的定义如下:#ifndef USED_FOR_TARGET...typedef union tree_node *tree; ...#else...#原创 2006-11-14 22:46:00 · 2803 阅读 · 0 评论 -
从编译器的角度看C代码
1、总论任何一个用C写的项目都是由若干文件构成,通常这些文件分为两大类:头文件和实现文件。头文件的后缀为.h,实现文件的后缀为.c。当然,也有一些文件是其他后缀,但这些文件通常也担当着头文件的角色(项目文件、配置文件及其它数据文件除外)。编译器的输入通常是实现文件,每一个实现文件对编译器来说是一个翻译单元,编译器将其翻译为目标代码,通常是一个obj文件。最后由链接器将所有的obj文件连成一个完原创 2006-03-24 17:07:00 · 3241 阅读 · 0 评论 -
消除左递归文法
无法根据左递归文法编写出递归下降分析器,因而把左递归文法等价变换为非左递归文法至关重要,以下是变换的算法:1、消除直接左递归原文法: E --> E a1 | E a2 | ... | E an | b1 | b2 | ... | bn消除后: E --> b1 E | b2 E | ... | bn E E--> a1 E | a2 E | ..原创 2006-03-17 17:37:00 · 10189 阅读 · 1 评论 -
编译器的整体构架
编译器多使用: 词法分析->语法分析->中间代码生成->(代码优化)->目标代码生成的流程。 其中词法分析严重影响着编译器的性能,对词法分析的优化很必要。提高词法分析速度的一个主要途径是使用高效的缓冲管理机制。另一个主要的方面就是实现优化的匹配控制流程。 对于词法分析和语法分析有很多的代码自动生成工具,使用这些工具生成的代码据说速度也很快,一般初学者写出的词法分析和语法分析模块的速度很难超过工具生原创 2005-12-24 11:07:00 · 5316 阅读 · 0 评论 -
正则文法和上下文无关文法
对于文法G=(V, T, S, P),如果产生式的形式如下:A -> xBA -> x其中A, B属于V,x属于T*,则称为右线性文法;相似的,如果产生式的形式如下:A -> BxA -> x则称为左线性文法。右线性文法和左线性文法统称为正则文法。正则表达式的表达能力等价于正则文法,正则表达式的定义如下:字母表中的任意字母是正则表达式,空串和空集也是正则表达式;原创 2005-12-24 10:52:00 · 19762 阅读 · 4 评论 -
C++句法歧义及消解方法
0. 引言 C++中的句法歧义主要由类似int (a)的代码引起,此类代码共有3种合法的结构解释: 第一种是声明符a两边具有冗余圆括号的对象声明,其等同于int a; 第二种是函数式转型,它是表达式的一种,其等同于(int) a; 第三种是函数类型标识符,其等同于int f(a b)。 既然一种代码可同时解释为声明、表达式和类型,根据排列组合,共可原创 2008-02-10 23:31:00 · 3449 阅读 · 0 评论