基本词法语法规则与程序元素

C程序是一个字符序列,编译器首先把程序的字符序列分解成称为记号(token)的词法元素,再根据确定的语法规则检查这些记号是否构成合法的串。记号是程序中具有语义的最基本组成元素。

字符及词法元素

1.字符集

C语言源程序是由字符序列构成的,C语言字符集是7位ASCLL码的子集

2.词法元素

编译器对C程序中的字符序列进行词法分析,即按照特定规则分解成称为记号的词法元素。记号共分5类:标识符、关键字、常量(含字符串常量)、运算符和标点符号。编译器从左至右收集字符,总是尽量建立最长的记号,即使结果并不构成有效的C语言程序。相邻记号可以用空白符或者注释符分开。

eg X+++++Y的词法分析

被分解成X、++、++、+、Y。

语法规则

由C语言字符集中的单个字符或多个字符按照确定的规则组成语义上关联的记号,再由记号根据确定的规则构成语句乃至整个程序文本,这些规则称为C语言语法规则。编译器根据语法规则检查程序的合法性,并根据语法规则识别每一条语句,同时进行相应的语义处理。

标识符、关键字及分隔符

1.标识符

C语言规定,标识符由字母、数字和下划线组成,但首字符必须是字母或下划线。大小写敏感!

2.关键字

也称为保留字,都是小写,不能作为普通标识符,但是却可以作为宏名,因为预处理发生在识别关键字之前。最新标准下(C11)的关键字见http://tool.oschina.net/apidocs/apidoc?api=cpp%2Fen%2Fc.html

3.分隔符

统称为空白字符,包括空格符、制表符、换页符及注释符

基本数据结构

数据是程序处理的对象。数据的取值范围及能对该数据实行的运算有该数据的类型决定。数据类型也就是数据的存储方式。它告知编译程序为该类型的对象在内存分配多大的空间,数据类型直接反应了一种语言的数据表达能力。

  1.数据类型的分类

 

2. 整形下各类型范围

3.浮点类型

只有三种浮点类型:float、double、long double.

常量与变量

1.文字常量:C语言有四种文字常量,包括整形、浮点型、字符型、字符串型。

  1)整形常量

    前缀区别进制:前缀为0表示八进制,0x或者0X表示十六进制,无前缀表示十进制;

   后缀指定类型:

u/U表示unsigned  l/L  ul/UL  ll/LL  ull/ULL.....

无后缀一般表示int 

   2)浮点型常量

有两种表示方法

a)带小数点十进制表示法

可以小数点开头,也可以小数点结尾,当然更可以在中间喽!(eg23.7  14.  .126)。

b)指数形式

指数部分跟在尾数部分后边,尾数部分同上a)相同,但可以没有小数点指数部分由一个字母e或者E、一个可选的符号+/-    和 一个整数n组成。

同整形常量一样,后缀指定类型,f =float lf=long double 没有后缀表示double

   3)字符常量

分为图形符号和转义序列。

    注意:'和\虽然是图形符号,但作为字符常量必须使用转义序列

转义序列分为字符转义序列和数字转义序列

字符转义序列:反斜线后跟图形符号,用于表示字符集中的非图形符号和一些特殊的图形字符。如

                                            \0 \a \b \t \n \v \f \r  \" \' \\ 

  数字转义序列:

  \000表示八进制,用完3个八进制位结束或者遇到第一个非八进制位终止(\11=\011)

\xhh表示十六进制,超过两位编译出错(\x9=\x09)

   4)字符串常量

转义序列依然有效

不能直接换行,用“\”或者分开双引号都行

结尾自动补'\0'

   2.符号常量

一个符号常量就是一个标识符,是给程序中经常使用的常量定义的名字。c语言有三种表示方法:

1)用#defien指令定义符号常量:预处理简单文本替换

2)用const声明语句定义一个符号常量:编译时分配内存

3)用枚举类型定义一组符号常量

   3.变量定义

每个变量都要显示初始化(eg int a=b=2;//error)

运算符和表达式

  

实验一:词法分析程序 一、实验目的     通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的类型码及单词符号的自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 用C或C++写一个简单的词法分析程序程序可以满足下列要求: 1、能分析如下几种简单的语言词法 (1) 标识符: ID=letter(letter|digit)* (2) 关键字(全部小写) main int float double char if then else switch case break continue while do for (3)整型常量:NUM=digit digit* (4)运算符 = + - * / < <= == != > >= ; ( )? : (5)空格由空白、制表符和换行符组成,用以分隔ID、NUM、运算符等,字符分析时被忽略。 2、单词符号和相应的类别码 假定单词符号和相应的类别码如下: 单词符号 种别码 int 1 = 17 float 2 < 20 if 3 <= 21 switch 4 == 22 while 5 != 23 Do 6 > 24 标识符 10 >= 25 整型常量 11 ; 26 + 13 ( 27 - 14 ) 28 * 15 ? 29 / 16 : 30 3、词法分析程序实现的功能 输入:单词序列(以文件形式提供),输出识别的单词的二元组序列到文件和屏幕 输出:二元组构成: (syn,token或sum) 其中: syn 为单词的种别码 token 为存放的单词自身符号串 sum 为整型常数 例: 源程序: int ab; float ef=20; ab=10+ef; 输出: (保留字--1,int) (标识符--10,ab) (分号--26,;) (保留字--2,float) (标识符--10,ef) (等号--17,=) (整数--11,20) (分号--26,;) (标识符--10,ab) (等号--17,=) (整数--11,10) (加号--13,+) (标识符--10,ef) (分号--26,;) 4、自己准备测试数据存放于TestData.txt文件中,测试数据中应覆盖有以上5种数据,测试结果要求以原数据与结果对照的形式输出并保存在Result.txt中,同时要把结果输出到屏幕。 5、提前准备 ① 实验前,先编制好程序,上机时输入并调试程序。 准备好多组测试数据(存放于文件TestData.txt中)。 6、写出实验报告 报告格式:要求有实验名称、实验目的、实验要求、实验内容、实验小结。 其中实验内容包括算法分析、程序流程图及程序代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值