编译原理试验-词法分析器的设计与实现0001

更新时间:2023-06-01 15:17:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

南华大学

计算机科学与技术学院

实验报告

(2018-2019学年度第二学期)

编译原理课程名称词法分析器的设计与实验名称

实现----------------------

姓名学号______________________________

专业班级 ________________________________

地点教师

1. 实验目的及要求

实验目的

加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够釆用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。

实验要求

1.对单词的构词规则有明确的定义;

2.编写的分析程序能够正确识别源程序中的单词符号;

3识别出的单词以v种别码,值〉的形式保存在符号表中,正确设计和维护符号

表;

4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,

保证顺利完成整个源程序的词法分析;

2. 实验步骤

1?词法分析规则

V标识符>::二V字母>|<标识符><字母>|V标识符>V数字〉

V常数〉::二V数字>|V数字序列><数字〉

V数字序列〉::= <数字序列〉V数字>|v数字>|<->

V 字母>::=a|b|c|……|x|y|z

v 数字>::二0 山2|3|4|5|6|7|8|9

V运算符〉;:二V关系运算符>|V算术运算符>|V逻辑运算符>|<位运算符〉|V赋值运

算符〉

V 算数运算符>::=+ |-|*|/|,..|-

v 关系运算符 >::=<|>|! = |> = |< = |==

v逻辑运算符〉::二&&||||!

V位运算符 >::二&|||!

V 赋值运算符 >::==| + = |- = |/=|*=

V分界符>::=,|;|(|)|{|}|: |//|/-/

v 保留字 >::=main|if|else|while|do|for|...|void

2?单词符号的编码

26>0main 271>=if 282else< 29while3< =

30do4!

31for!=5

326switch = 33==case7 348 int(

359 double) 36float 10 { 37long} 11 38void 12 ; 39

13

40 114+ =

41||15+ +

42 数16-

43标识17-二4418--,

45&//19 46&&20/**/

#21

*22

23*=

/24

/ 二

25

状态转换图3..

5

=1 丫母与数字空白 非字血与盘字字2 0

1

3其/ 5

/a

+

M H

10

=12

+

13

其14

15

=16

> 其山

19

<其20

21

(&?22

f

算法分析4.①词法分析器工作的第一步是输入源程序文本。为了更好地对单词符号识别,把输入串预处理一下。预处理主要滤掉空格,跳过注释、换行符等。嵌套语句和if-while②对预处理后的输入串依次扫描单个字符,使用语句判断字符的类型,具体识别方法可看状态转换图。有时switch case为了确定词性,需要超前扫描,若超前扫描的字符对识别当前单词无用?

处,则需要退还给输入串,以备识别下一单词字符时使用。

③若读入的字符与单词符号编码表的字符匹配不上,则报错,并输出出错行数。对识别处的单词符号以(单词符号,种别码)二元式的形式输出。

3. 实验内容

1.流程图

2.程序的变量与函数说明(1) in put

全局字符数组,用来存放输入串<2) word

全局字符数组,用来存放获取到的单词符号,限定长度为8

(3)ch

全局字符变量,用来存放最新读入的字符

(4)syn

全局整型变量,表示单词符号的编码

(5)p

全局整型变量,表示当前字符在input数组的位置

< 6)m

全局整型变量, 表示最新读入的字符在word数组的下标

<7) line

全局整型变量,当前行数

(8)keyword

全局字符数组,存放关键字

(9)initO

获取输入串

(10) isKeyQ

判断关键字的函数,若参数数组中是关键字,则把syn置为该关键字对应的编码并返回1,否则返回0

(11) isLetter()

判断字母的函数,若参数字符是字母,则返回1,否则返回0

(12) isDigitO

判断数字的函数,若参数字符是数字,则返回1,否则返回0

< 13) isSpaceQ

判断空白符的函数,若参数字符是空格、TAB或换行符,则返回1,否则返回0

< 14) scanerO

扫描输入串的函数,对读出的字符进行判断,若是单词符号表中的符号,则将syn 置为对应的编码

3.源程序

#include <stdio.h>

#include <string.h〉

char in put [1OOO];// 输入串

char word[8];//获取到的单词

char ch;

int syn〃种别码

int p;

int m;

int line;//行数

〃关键字

char keyword|][8]={main l if,else,while1do, or,switch,case,int.double,

loatjong.void};

void seaner(void);

〃获取输入串

void init()

{

int i=0;

printf(\

please input a string(end with ’#J:\n);

do{

scanf(%c, &ch);

in put[i + +]=ch;

}while(ch !='#');

}

〃判断是不是关键字int isKey(char *str)

int n;

for(n=0;n<13;n + +)

if (strcmp(str, keyword [n])==0)

syn 二n;

return 1;

}

return 0;

}

〃判断是不是数字

int isDigit(char c)

{

if (c>='0,&&c<=,9,)

return 1;

else

return 0;

}

〃判断是不是字母int isLetter(char c)

{

if ((c<='z'&&c>=,a,)||(c>=,A,&&c<=,Z,))

return 1;

else

return 0;

}

int isSpace(char c)

if (c二二J|c二二、f||c二二、nJ

return 1;

}

return 0;

void mainO

{

init();〃输入字符串

lin e=0;

p=o;

do{

scan er();

switch(sy n)

case -1:

printf(you have input a wrong string in line %d\n」ine); break;

default:

printf(( %s,%d )\n,word?syn);

break;

}while(syn!=21);

void seaner(void)

{

〃清空word

for(m=0;m<8;m++)

{

word[m]=

}

//读取字符

ch=i nput[p++];

m=0;

为空格或换行符时,继续往下读〃当ch

if (ch ==,\n,)

lin e++;

} ch 二i nput[p++];

}

while(isSpace(ch))

〃如果以字母开头

if(isLetter(ch))

{

〃如果往后是字母或数字,把字符存入word中,然后往下继续读〃串长超过8则截断

while((isLetter(ch)||isDigit(ch))&&m<8)

{

word[m++]=ch;

ch 二i nput[p++];

p--;

syn 二43;

word[m++]=,\0,;

isKey(word);//判断是不是关键字

}

〃如果是以数字开头,并且往后是数字

else if(isDigit(ch))

{

while((isDigit(ch)||ch =='.1)&&m<8)

word[m++]=ch;

ch 二i nput[p++];

}

则出错〃如果数字之后是字母,if (isLetter(ch)) {

while(!isSpace(ch))

ch 二i nput[p++];

syn 二-1;

return ;

}

p--;

syn 二42;

}

else

{

switch(ch)

〃比较运算符

case V:

word[m++]=ch;

ch=i nput[p++]; if (ch 二二士)

syn=29;

本文来源:https://www.bwwdw.com/article/s3c1.html

Top