第一章:词法陷阱
1)词法分析器:编译器中负责将程序分解成一个一个符号的部分
2)= 不同于 ==
在循环语句中如果出现 = 会发出警告(waring)。
例:先将y赋值给x,然后判断是否为0。为了避免警告可以将 if(x=y) fun(); 改成 if( (x=y) !=0) fun();
3)&和| 不同于 && 和||
4)词法分析中的贪心法
编译器将程序分解成符号的方法是:从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。
例:a---b 含义是 (a--) - b
y=x/*b // 由于 / 的优先级 大于 *解引用,所以符号解析为 /* 注释开始符
改为:y=x/(*b)
5)如果一个整型常数的第一个字符是数字0,那么该常量将被视作八进制数
例:0195相当于十进制数141 (允许出现大于等于 8的数)
6)注释嵌套,写一个 程序测试 是否允许嵌套
int reusult = /*/*/0*/**/1;
如果允许嵌套:/* /* / 0 */ * */ 1 结果为 1
如果不允许嵌套:/* / */ 0 * /* */ 1 结果为 0 *1 为0
7)C语言不允许 注释嵌套
8)a+++++b 的含义
a++ + ++b
((a++)++) +b // a++ 表达式不能作为 ++ 的左值
第二章 语法陷阱
1) 解释 (*(void(*)())0)()的含义
void(*)() 是一个函数指针,该函数返回void型数据
(void(*)())0 就是将常数0转换为指向返回值为void的函数的指针
(*(void(*)())0)() 是一个表达式,调用0地址的函数
该表达式相当:
typedef void (*funcptr)();
(*(funcptr)0)()
2)运算符的优先级
优先级
|
运算符
|
名称或含义
|
使用形式
|
结合方向
|
说明
|
1
|
[]
|
数组下标
|
数组名[常量表达式]
|
左到右
|
|
()
|
圆括号
|
(表达式)/函数名(形参表)
|
|
.
|
成员选择(对象)
|
对象.成员名
|
|
->
|
成员选择(指针)
|
对象指针->成员名
|
|
2
|
-
|
负号运算符
|
-表达式
|
右到左
|
单目运算符
|
(类型)
|
强制类型转换
|
(数据类型)表达式
|
|
++
|
自增运算符
|
++变量名/变量名++
|
单目运算符
|
--
|
自减运算符
|
--变量名/变量名--
|
单目运算符
|
*
|
取值运算符
|
*指针变量
|
单目运算符
|
&
|
取地址运算符
|
&变量名
|
单目运算符
|
!
|
逻辑非运算符
|
!表达式
|
单目运算符
|
~
|
按位取反运算符
|
~表达式
|
单目运算符
|
sizeof
|
长度运算符
|
sizeof(表达式)
|
|
3
|
/
|
除
|
表达式/表达式
|
左到右
|
双目运算符
|
*
|
乘
|
表达式*表达式
|
双目运算符
|
%
|
余数(取模)
|
整型表达式/整型表达式
|
双目运算符
|
4
|
+
|
加
|
表达式+表达式
|
左到右
|
双目运算符
|
-
|
减
|
表达式-表达式
|
双目运算符
|
5
|
<<
|
左移
|
变量<<表达式
|
左到右
|
双目运算符
|
>>
|
右移
|
变量>>表达式
|
双目运算符
|
6
|
>
|
大于
|
表达式>表达式
|
左到右
|
双目运算符
|
>=
|
大于等于
|
表达式>=表达式
|
双目运算符
|
<
|
小于
|
表达式<表达式
|
双目运算符
|
<=
|
小于等于
|
表达式<=表达式
|
双目运算符
|
7
|
==
|
等于
|
表达式==表达式
|
左到右
|
双目运算符
|
!=
|
不等于
|
表达式!= 表达式
|
双目运算符
|
8
|
&
|
按位与
|
表达式&表达式
|
左到右
|
双目运算符
|
9
|
^
|
按位异或
|
表达式^表达式
|
左到右
|
双目运算符
|
10
|
|
|
按位或
|
表达式|表达式
|
左到右
|
双目运算符
|
11
|
&&
|
逻辑与
|
表达式&&表达式
|
左到右
|
双目运算符
|
12
|
||
|
逻辑或
|
表达式||表达式
|
左到右
|
双目运算符
|
13
|
?:
|
条件运算符
|
表达式1? 表达式2: 表达式3
|
右到左
|
三目运算符
|
14
|
=
|
赋值运算符
|
变量=表达式
|
右到左
|
|
/=
|
除后赋值
|
变量/=表达式
|
|
*=
|
乘后赋值
|
变量*=表达式
|
|
%=
|
取模后赋值
|
变量%=表达式
|
|
+=
|
加后赋值
|
变量+=表达式
|
|
-=
|
减后赋值
|
变量-=表达式
|
|
<<=
|
左移后赋值
|
变量<<=表达式
|
|
>>=
|
右移后赋值
|
变量>>=表达式
|
|
&=
|
按位与后赋值
|
变量&=表达式
|
|
^=
|
按位异或后赋值
|
变量^=表达式
|
|
|=
|
按位或后赋值
|
变量|=表达式
|
|
15
|
,
|
逗号运算符
|
表达式,表达式,…
|
左到右
|
从左向右顺序运算
|
说明:
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
例1:
home_score = visitor_score = 0;
等同于
visitor_score = 0;
home_score = visitor_score;
例2:
if(flags & FLAG!=0) // != 的优先级 大于 &
口诀:
括号成员第一 //括号运算符[]() 成员运算符. ->
全体单目第 //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&乘除余三,加减四; //这个"余"是指取余运算即%
移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等
等于(与)不等排第七 //即== 和!=
位与异或和位或; //这几个都是位运算: 位与(&)异或(^)位或(|)
"三分天下"八九十
逻辑或跟与 //逻辑运算符:|| 和 &&
十二和十一 //注意顺序:优先级(||) 底于 优先级(&&)
条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和","高
逗号运算级最低 //逗号运算符优先级最低
3)注意作为语句结束标志的分号
struct node {
int data;
node *next;
}; // 这个分号如果忘记,不报错,认为 main 函数返回值类型为 node
main()
{……}
例2:
if(a>b)
return //这里分号忘记,则返回 log.b 5
log.b=5;
4)注意 swtich 中 break 和 if else 匹配问题
分享到:
相关推荐
这是我毕设的一部分,毕设做的是C语言编译器,这部分是编译器的词法分析和语法分析。开发平台Visual Stuido 2010。语法分析仅仅是分析语法对不对,如果对会输出“OK”,反之输出“ERROR”词法分析完会把单词和类型列...
C语言开发课程设计词法分析器源代码介绍 课程设计:词法分析器; 实验1:词法分析实验 实验2:语法分析实验 课程设计 设计任务: 使用词法分析的自动生成工具 Flex 生成 C/C++语言的词法分析器 ,当输入C/C++源代码...
c语言编译原理词法语法分析c语言编译原理词法语法分析
很不错的哦,有很友好的界面的,我个人觉的不错
Pascal 词法分析 语法分析 C语言 Pascal Compiler(词法分析+语法分析)C语言版
华中科技大学 编译原理 面向过程的C语言的编译器设计 功能包括:词法分析和语法分析、语义分析、中间代码生成的 源码 题目:c--语言编译器设计与实现(请为自己的编译器命名) 源语言定义:或采用教材中Decaf语言,...
编译词法和语法分析源码 编译词法和语法分析源码编译词法和语法分析源码 编译词法和语法分析源码编译词法和语法分析源码编译词法和语法分析源码编译词法和语法分析源码编译词法和语法分析源码
编译原理课程设计词法语法分析器 编译原理课程设计词法语法分析器
编译原理 词法分析 语法分析 c语言程序源代码
词法语法解析器
数据库词法语法分析Demo,适合入门学习数据库词法语法的同学借鉴一下!
这是一个关于C语言的一个子集的编译器,其中包括了一个编译器所包含的全部,有词法分析,语法分析,及token表的生成与显示,中间代码(三元式)及目标代码(汇编指令)的生成与显示。采用C++,MFC编译实现的可视化...
用C语言写的一个带词法分析的语法分析器,语法分析采用递归向下分析法
C语言半自动词法分析器和半自动语法分析器 C语言的半自动词法分析器和半自动语法分析器是指那些部分手动编写、部分自动生成的分析器。这些分析器通常用于教育目的,帮助学生理解编译器的工作原理,同时也减少了完全...
《C陷阱与缺陷》是人民邮电出版社2008...全书分为8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题。最后,作者用一章的篇幅给出了若干具有实用价值的建议
简化C的词法分析和语法分析程序的实现,先对测试程序进行词法分析,然后再进行语法分析
用C语言写的类C语言的词法分析器,对于理解词法分析会很有帮助。
一个超级经典的词法和语法分析程序(附加源代码).从词法分析的输出过渡到语法分析
借助Lex和Yacc进行词法语法分析借助Lex和Yacc进行词法语法分析借助Lex和Yacc进行词法语法分析借助Lex和Yacc进行词法语法分析借助Lex和Yacc进行词法语法分析借助Lex和Yacc进行词法语法分析借助Lex和Yacc进行词法语法...
字符和字符串、防御性编程、嵌套注释、词法分析的“大嘴原则”等需要注意的缺陷与陷阱。