- 34
- 0
- 约1.1万字
- 约 14页
- 2017-09-05 发布于陕西
- 举报
实验二 单词符号种别识别程序设计
一、实验目的
通过C语言词法分析程序的实现理解编译程序过程中词法分析对单词的种别识别过程。
二、实验重难点
单词识别
三、实验内容与要求
阅读教材P2-P3词法分析部分内容,明确词法分析的任务。
阅读实验案例,明确实验要求、模块流程图和程序实现方案;
参考实验案例,完成简单的词法分析程序设计。
四、实验学时
4课时
五、实验设备与环境
C语言编译环境
六、实验案例
待分析的简单的词法
关键字:
begin if then while do end
所有的关键字都是小写。
运算符和界符
: = + - * / = = = ; ( ) #
其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:
ID = letter (letter | digit)*
NUM = digit digit*
空格由空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。
各种单词符号对应的种别码见表6.1:
表6.1 各种单词符号对应的种别码
单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 = 18 then 3 20 while 4 != 21 do 5 = 22 end 6 23 { 7 = 24 } 8 == 25 ++ 9 ; 26 lettet(letter|digit)* 10 ( 27 dight dight* 11 ) 28 + 13 -- 29 - 14 \ 30 * 15 ! 31 / 16 # 0
词法分析程序的功能:
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
例如:对源程序begin x:=9; if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……
词法分析程序的算法思想:
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
主程序示意图:
主程序示意图如图6-1所示。其中初值包括以下两个方面:
关键字表的初值:
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:
Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};
否
是
图6-1 主程序流程图
程序中需要用到的主要变量为syn,token和sum
扫描子程序的算法思想:
首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来存放整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图6-2所示。
是
否
字母
数字 其他
运算符、 符号
界符等符号
否
是
图 6-2 扫描子程序算法流程图
词法分析程序的C语言程序源代码:
#include stdio.h
#include stdlib.h
#include string.h
#include ctype.h
#include malloc.h
#include conio.h
char prog[80], ch;
int p,m,n;
char token[8];
int syn,sum;
char *rwtab[6]={begin,if,then,while,do,end}; //关键字表初始化
scaner(); //声明一个函数名为scanser()的子函数
main()
{p=0;
printf(\n please input a string(end with #):\n);
do{
scanf(%c,ch);//用%c控制输入则空格等
原创力文档

文档评论(0)