当前位置:文档之家› 编译原理-词法分析

编译原理-词法分析

编译原理-词法分析
编译原理-词法分析

课程设计报告

课程名称编译原理

课题名称Micro语言词法语法分析

专业计算机科学与技术

班级

学号

姓名

指导教师

湖南工程学院编译原理课程设计

湖南工程学院

课程设计任务书

课程名称编译原理

课题

专业班级

学生姓名

学号

审批

任务书下达日期

任务完成日期

2011级《编译原理课程设计》任务书

一、课程设计的性质和目的

编译原理课程设计是计算机专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握编译程序编写的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事高层次的计算机软件开发工作打下一定的专业基础。

二、设计课题

课题一:应用编译原理的方法实现带括号的四则混合运算

给定条件:

1、词法符号定义如下:

INTC → D+

FLOATC → (D+.D+) | (D+.) | ( .D+)

FLOATC →( (D+.D+) | (D+.) | ( .D+)| (D+) ) ( E | e ) ( + | ? | λ ) D+

OPADD → +

OPSUB →?

OPMUL → *

OPDIV → /

LPAREN →‘(’

RPAREN →‘)’

LINE →‘\n’

ASSIGN → =

2、表达式文法定义如下:

01. S → E

02. E → T

03. E → E OPADD T

04. E → E OPSUB T

05. T → P

06. T → T OPMUL P

07. T → T OPDIV P

08. P → INTC

09. P → FLOATC

10. P → LPAREN E RPAREN

基本要求:

1、以ASSIGN作为文法结束符号;

2、应用词法分析技术识别单词;

3、应用SLR(1)分析技术判别表达式的合法性;

4、应用尾动作文法技术计算表达式的类型与值;

5、要求表达式的类型与值严格一致。

课题二:Micro语言词法语法分析

给定条件:

1、词法符号定义如下:

ID → L(L|D)*

INTC → D+

REALC → D+? D+

PLUS → +

MULT → *

LPAREN → (

RPAREN → )

COLON →:

ASSIGN →:=

SEMI →;

LINE →’\n’

STOP →?

FEOF → EOF

2、表达式文法定义如下:

01. PROG →BEGIN DECL BODY END STOP

02. DECL →DECL V AR ID COLON TYPE SEMI

03. DECL →V AR ID COLON TYPE SEMI

04. TYPE →REAL

05. TYPE →INTEGER

06. BODY →BODY SEMI STM

07. BODY →STM

08. STM →ID ASSIGN EXP

09. STM →WRITE LPAREN EXP RPAREN

10. STM →READ LPAREN ID RPAREN

11. EXP →EXP PLUS FACT

12. EXP →FACT

13. FACT →FACT MULT PRIM

14. FACT →PRIM

15. PRIM →ID

16. PRIM →INTC

17. PRIM →REALC

18. PRIM →LPAREN EXP RPAREN

基本要求:

1、以FEOF作为文法结束符号;

2、应用词法分析技术识别单词;

3、应用SLR(1)分析方法进行语法分析;

4、报错要指明所在行。

三、课程设计报告要求

1、课程设计报告必须按本系规定的格式要求打印成册;

2、课程设计报告每人一份,正文必须包含如下几个方面的内容:

1)基本设计思想;

2)主要数据结构;

3)总结与体会。

3、课程设计报告装订顺序:封面、任务书、目录、正文、源程序清单。

四、选题及考核办法

1、一人一组,学号为奇数者做课题一,学号为偶数者做课题二。

2、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。

五、设计进度安排

1、讲课时间安排:

2、上机调试时间安排:

17周:周一8:00——11:30

周二2:30——6:00

周四8:00——11:30

周五2:30——6:00

3、答辩时间安排:

4、其余时间:查阅资料,确定方案,设计课题相关程序。

目录

一、基本设计思想 (7)

二、基本设计分析 (7)

1. Micro语言词法分析 (7)

2. Micro语言语法分析器 (8)

三、主要的数据结构 (15)

四、调试及运行结果 (16)

五、总结及体会 (18)

六.源程序清单 (18)

一、基本设计思想

该课题是根据Micro语法对输入的字符串源代码进行词法分析和语法分析,判定是否符合Micro的语法规则。基础知识有:

基本符号;程序文本;程序文件;语义单位;单词分类;空格符号;换行符号;单词编码;语义信息;

读进字符;识别字符;过滤格式符;常数翻译;读进常数;读进标识符;保留字。

[Micro语言定义]:定义一个很小的语言Micro,其程序是由begin和end括起来的语句序列,而语句则只有赋值语句、输入语句和输出语句3种。变量均定义为整型变量。表达式由整数、变量和运算符组成。

二、基本设计分析

1.Micro语言词法分析

1)以英文翻译为例:首次依次分辨出一个单词并查字典,若查到则认为单词未错,否则认为单词错。如果是正确的单词,则还要确定其词类,即确定是名词还是动词。程序文件的处理过程也类似。

词法分析部分是通过构造有穷自动机来实现的。对自动机的每一个状态,都设置状态标志,这样就能够实时查看词法分析进入的状态,在词法分析中需要对分析出的标识符进行是否有保留字的判断,保留字和词法分析的各状态标志都定义在全局变量中。

2)Micro语言各词法元素的正则表达式

ID → L(L|D)*

INTC → D+

REALC → D+? D+

PLUS → +

MULT → *

LPAREN → (

RPAREN → )

COLON →:

ASSIGN →:=

SEMI →;

LINE →’\n’

STOP →?

FEOF → EOF

3)Micro 语言的有限自动机

2.Micro 语言语法分析器

1)语法分析任务:语法分析的任务是检查源程序是否为合法的单词序列。若有错误,则可指出错误单词的位置(第几行,第几个单词)和错误性质等

语法分析部分使用SLR(1)方法进行语法分析,该方法 不显示的使用符号栈,而是使用状态栈,SLR(1)方法的核心是构造action 表和goto 表,这里使用了action 图来表示,在课题中已经画出了各个状态接收Token 后的动作,因此程序中只需要进行相应的添加即可。SLR(1)语法分析方法的主要动作有两个,一是进行移入操作(shiift )二是进行规约(reduce )动作。使用SLR(1)方法需要求出非终极符的Follow 集。该编译程序对出错的信息进行了行输出,指出了出错的行,对出错行的处理时单独进行的。

13

?

L

1

L|D

D

2

D

?

3

4

D D

5

+

6

* 7

(

8

) 9

:

10

= 11

;

12

‘\n ’ ID

INTC

REALC

PLUS

MULT

LPAREN RPAREN COLON

ASSIGN SEMI

LINE

STOP

2)Micro语言SLR(1)语法分析

01. PROG →BEGIN DECL BODY END STOP

02. DECL →DECL V AR ID COLON TYPE SEMI

03. DECL →V AR ID COLON TYPE SEMI

04. TYPE →REAL

05. TYPE →INTEGER

06. BODY →BODY SEMI STM

07. BODY →STM

08. STM →ID ASSIGN EXP

09. STM →WRITE LPAREN EXP RPAREN

10. STM →READ LPAREN ID RPAREN

11. EXP →EXP PLUS FACT

12. EXP →FACT

13. FACT →FACT MULT PRIM

14. FACT →PRIM

15. PRIM →ID

16. PRIM →INTC

17. PRIM →REALC

18. PRIM →LPAREN EXP RPAREN

符号FIRST集合FOLLOW集合

PROG BEGIN FEOF

DECL V AR ID WRITE READ V AR

TYPE REAL INTEGER SEMI

BODY ID WRITE READ SEMI END

STM ID WRITE READ SEMI END

EXP ID INTC REALC LPAREN SEMI END PLUS RPAREN FACT ID INTC REALC LPAREN SEMI END PLUS RPAREN MULT PRIM ID INTC REALC LPAREN SEMI END PLUS RPAREN MULT

PROG →·BEGIN DECL BODY END STOP BEGIN S1

1

PROG →BEGIN·DECL BODY END STOP DECL →·DECL V AR ID COLON TYPE SEMI

DECL →·V AR ID COLON TYPE SEMI

DECL S2

V AR S3

2

PROG →BEGIN DECL·BODY END STOP

DECL →DECL·V AR ID COLON TYPE SEMI BODY→·BODY SEMI STM

BODY→·STM

STM →·ID ASSIGN EXP

STM →·WRITE LPAREN EXP RPAREN STM →·READ LPAREN ID RPAREN

BODY S4

V AR S5

STM S6

ID S7

WRITE S8

READ S9

3

DECL →V AR·ID COLON TYPE SEMI

ID S10

4

PROG →BEGIN DECL

BODY·END STOP

BODY→BODY ·SEMI STM

END S11

5

DECL →DECL V AR·ID COLON TYPE SEMI ID S13

6 BODY→STM·

SEMI R7 END R7

7

STM →ID·ASSIGN EXP

ASSIGN S14

8

STM →WRITE·LPAREN EXP RPAREN LPAREN S15

9

STM →READ·LPAREN ID RPAREN

10

DECL →V AR ID·COLON TYPE SEMI COLON S17

11

PROG →BEGIN DECL BODY END·STOP STOP S18

12

BODY→BODY SEMI·STM

STM →·ID ASSIGN EXP

STM →·WRITE LPAREN EXP RPAREN

STM →·READ LPAREN ID RPAREN

STM S19

ID S7

WRITE S8

READ S9

13

DECL →DECL V AR ID·COLON TYPE SEMI COLON S20

14

STM →ID ASSIGN·EXP

EXP →·EXP PLUS FACT

EXP →·FACT

FACT →·FACT MULT PRIM FACT →·PRIM

PRIM →·ID

PRIM →·INTC

PRIM →·REALC

PRIM →·LPAREN EXP RPAREN

EXP S21

FACT S22

PRIM S23

ID S24

INTC S25

REALC S26

LPAREN S27

15

STM →WRITE LPAREN·EXP RPAREN EXP →·EXP PLUS FACT

EXP →·FACT

FACT →·FACT MULT PRIM

FACT →·PRIM

PRIM →·ID

PRIM →·INTC

PRIM →·REALC

PRIM →·LPAREN EXP RPAREN

EXP S28

FACT S22

PRIM S23

ID S24

INTC S25

REALC S26

LPAREN S27

16

STM →READ LPAREN·ID RPAREN ID S29

17

DECL →V AR ID COLON·TYPE SEMI TYPE →·REAL

TYPE →·INTEGER

TYPE S30

REAL S31

INTEGER S32

18

PROG →BEGIN DECL BODY END STOP·FEOF R1

19 BODY→BODY SEMI STM·SEMI R6

END R6

20

DECL →DECL V AR ID COLON·TYPE SEMI TYPE →·REAL

TYPE →·INTEGER

TYPE S33

REAL S31

INTEGER S32

21 STM →ID ASSIGN EXP·EXP →EXP·PLUS FACT

PLUS S34 SEMI R8 END R8

22

EXP →FACT·

FACT →FACT·MULT PRIM

MULT S35

SEMI R12

END R12

PLUS R12

RPAREN R12

23

FACT →PRIM·

SEMI R14 END R14 PLUS R14 RPAREN R14 MULT R14

24 PRIM →ID·

SEMI R15

END R15

PLUS R15 RPAREN R15

MULT R15

25 PRIM →INTC·

SEMI R16

END R16

PLUS R16 RPAREN R16

MULT R16

26 PRIM →REALC·SEMI R17

END R17

PLUS R17 RPAREN R17

MULT R17

27

PRIM →LPAREN·EXP RPAREN EXP →·EXP PLUS FACT

EXP →·FACT

FACT →·FACT MULT PRIM FACT →·PRIM

PRIM →·ID

PRIM →·INTC

PRIM →·REALC

PRIM →·LPAREN EXP RPAREN

EXP S36

FACT S22

PRIM S23

ID S24

INTC S25

REALC S26

LPAREN S27

28

STM →WRITE LPAREN EXP ·RPAREN EXP →EXP·PLUS FACT

RPAREN S37

PLUS S34

29

STM →READ LPAREN ID·RPAREN

30

DECL →V AR ID COLON TYPE·SEMI SEMI S39

31 TYPE →REAL·

SEMI R4

32 TYPE →INTEGER·SEMI R5

33

DECL →DECL V AR ID COLON TYPE·SEMI SEMI S40

34

EXP →EXP PLUS·FACT FACT →·FACT MULT PRIM FACT →·PRIM

PRIM →·ID

PRIM →·INTC

PRIM →·REALC

PRIM →·LPAREN EXP RPAREN

FACT S41

PRIM S23

ID S24

INTC S25

REALC S26

LPAREN S27

35

FACT →FACT MULT·PRIM PRIM →·ID

PRIM →·INTC

PRIM →·REALC

PRIM →·LPAREN EXP RPAREN

PRIM S42

ID S24

INTC S25

REALC S26

LPAREN S27

三、主要的数据结构

在词法分析部分使用了堆栈lexstack 来记录出现的错误的字符,用枚举类型来定义频繁使用的关键字,文法非终极符等常量。在本程序中没有使用递归的方法来进行词法分析,这里使用了while 循环和switch 语句相结合的方式,有效地提高了词法分析的效率。

在语法分析部分,使用了状态栈state 来保存语法分析进入的各个状态,对于每一个状态的可能的两种动作,采用了宏定义的形式来定义移入操作(shift )和规约动作(reduce )。这里显示的使用了状态栈,不显示的使用符号栈,在进行规约动作中需要指出文法产生式左部的非终极符和该产生式右部的文法符号的个数。规约的动作可以是一个递归的过程,这里也是使用了while 循环和swith 语句相结合的方式来对当前的Token 和预读入的Token 进行相应的处理。

该程序的主要函数及其功能如下:

int main(int argc,char *argv[])函数:如果在命令行中运行本程序的话,需要带上相应的参数,其中第一个各参数即为该程序可执行文件的名称,第二个参数为要进行编译处理的源程序的文件名,第三个参数为经过程序处理后错误信息的输出文件名(可以没有参数)

LexType lex(char *word)函数:该函数主要是进行词法分析,通过调用该函数即可得到一个Token ,该Token

36

PRIM →LPAREN EXP · RPAREN EXP →EXP · PLUS FACT RPAREN S43 PLUS

S34

37

STM →WRITE LPAREN EXP RPAREN · SEMI R9 END

R9

38

STM →READ LPAREN ID RPAREN · SEMI R10 END

R10

39

DECL →V AR ID COLON TYPE SEMI ·

ID

R3 WRITE R3 READ R3 V AR

R3

42

FACT →FACT MULT PRIM · SEMI R13 END R13 PLUS R13 RPAREN R13 MULT

R13

43

PRIM →LPAREN EXP RPAREN · SEMI R18 END R18 PLUS R18 RPAREN R18 MULT

R18

40

DECL →DECL V AR ID COLON TYPE SEMI · ID

R2 WRITE R2 READ R2 V AR

R2

41

EXP →EXP PLUS FACT ·

FACT →FACT · MULT PRIM MULT S35 SEMI R11 END R11 PLUS R11 RPAREN

R11

的值保存在参数word中。

V oid getnexttoken(char *word)函数:该函数也是获取一个Token,它是通过调用lex函数来实现获取一个Token 的。

V oid parse(void)函数:该函数主要是语法分析的部分,通过语法分析即可得出相应的分析结果。

各函数的调用关系式main函数调用parse函数,parse函数调用getnexttoken函数,而getnexttoken函数则调用词法分析函数lex;

四、调试及运行结果

测试用例:

Begin

Var x:integer;

Read(x)

End。

手动分析如下:

[1](LPAREN,“(”) [2](ID,“x”) [3](COLON,“:”) [4](SEMI,“;”)

[5](STOP,“.”) [6](RPAREN,“)”)

01 Var x:integer; read(x) end. S3

013 x: integer; read(x) end. S10

01310 : integer; read(x) end. S17

0131017 integer; read(x) end. S32

013101732 ; read(x) end. R5

0131017 TYPE ; read(x) end. S30

013101730 ; read(x) end. S39

01310173039 read(x) end. R3

01 DECL read(x) end. S2

012 read(x) end. S9

0129 (x) end. S16

012916 x) end. S29

01291629 ) end. S38

0129162938 end. R10

012 STM end. S6

0126 end. R7

012 BODY end. S4

0124 end. S11

012411 . S18

01241118 FEOF R1

0 PROG

测试用例及其运行结果1.错误在第三行:

2.错误在第四行:

3.正确的micro语言文法:

五、总结及体会

通过此次课程设计,使我更加扎实的掌握了词法分析及语法分析的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了编译原理基本的设计与实现,对于编译器和解释器的概念有了较深的理解。

我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。

回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。

此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。

六.源程序清单

#include

#include

#define ReserveNum 7

#define BUFSIZE 1024

#define SHIFT(NUM) top++;\

state[top]=NUM;\

getnexttoken(word,in,out)

#define REDUCE(SYM,NUM) top=top-NUM;\

buftoken=curtoken;\

buftokenflag=1;\

curtoken=SYM

#define ERRORPROCESS fprintf(out,"Error line:%d\n",lineno)

typedef enum {/*关键字*/

BEGIN, END, VAR, READ, WRITE, INTEGER, REAL,

/*其它词法符号*/

ID, INTC, REALC, PLUS, MULT, LPAREN, RPAREN,

COLON, ASSIGN, SEMI, STOP, LINE,

/*文法的非终极符*/

PROG, DECL, BODY, TYPE, STM, EXP, FACT, PRIM,

/*词法分析和语法分析程序依赖的2个单词类别*/

FEOF, ERROR

} LexType;

/* 语法分析使用的变量*/

static LexType curtoken,buftoken;

static int buftokenflag=0;

static int lineno=1;

LexType lex(char *word,FILE *in)

{ static char *Reserve[]={"begin","end","var","read","write","integer","real"};

static LexType StateFlag[]={ERROR,ID,INTC,ERROR,REALC,PLUS,MULT,

LPAREN,RPAREN,COLON,ASSIGN,SEMI,LINE,STOP}; static char stack[BUFSIZE];

static int stacktop=-1;

char tryword[BUFSIZE];

LexType tryflag[BUFSIZE];

int index;int state;char curchar;index=0;state=0;

curchar=' ';

while(curchar==' '||curchar=='\t')

if (stacktop==-1) curchar=fgetc(in);

else curchar=stack[stacktop--];

if (curchar==EOF){

word[0]=EOF;word[1]='\0'; return FEOF;

}

while (1)

{ tryword[index]=curchar;

switch (state)

{ case 0:

switch (curchar)

{ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':

case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':

case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':

case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':

case 'Y': case 'Z':

case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':

case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':

case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':

case 's': case 't': case 'u': case 'v': case 'w': case 'x':

case 'y': case 'z':state=1;break;//1

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9': state=2;break;//2

case '+': state=5;break;

case '*': state=6;break;

case '(': state=7;break;

case ')': state=8;break;

case ':': state=9;break;

case ';': state=11;break;

case '\n': state=12;break;

case '.': state=13;break;

default: state=-1;break;

} ;

break;

case 1:

switch (curchar)

{ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':

case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':

case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':

case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':

case 'Y': case 'Z':

case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':

case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':

case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':

case 's': case 't': case 'u': case 'v': case 'w': case 'x'://L

case 'y': case 'z':

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9'://D

state=1;break;//1

default: state=-1;break;

} ; break;

case 2:

switch (curchar)

{ case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9'://D

state=2;break;

case '.': state=3;break;

default: state=-1;break;

} ; break;

case 3:

switch (curchar)

{

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9':

state=4;break;

编译原理实验--词法分析器

编译原理实验--词法分析器 实验一词法分析器设计 【实验目的】 1(熟悉词法分析的基本原理,词法分析的过程以及词法分析中要注意的问题。 2(复习高级语言,进一步加强用高级语言来解决实际问题的能力。 3(通过完成词法分析程序,了解词法分析的过程。 【实验内容】 用C语言编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符 串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字, 运算符,标识符,常数以及界符)输出。 【实验流程图】

【实验步骤】 1(提取pl/0文件中基本字的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) {

if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {printf("%s\t",wsym[m]);m=14;n=k+1;} } 2(提取pl/0文件中标识符的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]=" "; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) { if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {m=14;n=k+1;} } if(m==13) for(m=0;a[m]!=NULL;m++) printf("%c ",a[m]);

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理词法分析器语法分析器实验报告

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

编译原理实验词法分析实验报告

编译技术实验报告 实验题目:词法分析 学院:信息学院 专业:计算机科学与技术学号: 姓名:

一、实验目的 (1)理解词法分析的功能; (2)理解词法分析的实现方法; 二、实验内容 PL0的文法如下 …< >?为非终结符。 …::=? 该符号的左部由右部定义,可读作“定义为”。 …|? 表示…或?,为左部可由多个右部定义。 …{ }? 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次 数,有上下界时可重复次数的限制。 …[ ]? 表示方括号内的成分为任选项。 …( )? 表示圆括号内的成分优先。 上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号…?括起。 〈程序〉∷=〈分程序〉. 〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉}:INTEGER; 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷=〈标识符〉∶=〈表达式〉 〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')' 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=* 〈关系运算符〉∷=<>|=|<|<=|>|>= 〈条件语句〉∷=IF〈条件〉THEN〈语句〉 〈字母〉∷=a|b|…|X|Y|Z 〈数字〉∷=0|1|2|…|8|9 实现PL0的词法分析

编译原理词法分析和语法分析报告+代码(C语言版)

词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

3.1 主程序示意图: 主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token和sum 3.2 扫描子程序的算法思想: 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

编译原理词法分析实验报告

词法分析器实验报告 一、实验目的 选择一种编程语言实现简单的词法分析程序,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 各种单词符号对应的种别码: 表各种单词符号对应的种别码 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根

据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 主程序示意图: 主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token和sum 扫描子程序的算法思想: 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn 用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

编译原理词法分析和语法分析报告 代码(C语言版)

词法分析 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 扫描子程序主要部分流程图 其他

词法分析程序的C语言程序源代码: // 词法分析函数: void scan() // 数据传递: 形参fp接收指向文本文件头的文件指针; // 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。 void scan() { char ch; int flag,j=0,i=-1; while(!feof(fp1)) { ch=fgetc(fp1); flag=judge(ch); printf("%c",ch);//显示打开的文件 if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;} else if(flag==4) {i++;buffer[i]='?';line[i]=row;} else if(flag==5) {i++;buffer[i]='~';row++;} else if(flag==7) continue; else cout<<"\n请注意,第"<

编译原理C语言词法分析器

编译原理 C语言词法分析器 一、实验题目 编制并调试C词法分析程序。 a.txt源代码: ?main() { int sum=0 ,it=1;/* Variable declaration*/ if (sum==1) it++; else it=it+2; }? 设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如++)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 二、实验目的 1、理解词法分析在编译程序中的作用; 2、掌握词法分析程序的实现方法和技术; 3、加深对有穷自动机模型的理解。 三、主要函数 四、设计 1.主函数void main ( )

2. 初始化函数void load ( ) 3. 保留字及标识符判断函数void char_search(char *word) 4. 整数类型判断函数void inta_search(char *word) 5. 浮点类型判断函数void intb_search(char *word)

6. 字符串常量判断函数void cc_search(char *word) 7. 字符常量判断函数void c_search(char *word) 同4、5函数图 8.主扫描函数void scan ( ) 五、关键代码 #include #include

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

编译原理实验报告一 简单样本语言的词法分析器

理工大学信息工程与自动化学院学生实验报告 (2012 —2013学年第一学期) 一、实验目的及容 编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(框原理图或程序流程图) 1、待分析的简单语言的词法 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 3、词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 二、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC以及VISUAL C++6.0软件。 三、实验法、步骤(或:程序代码或操作过程) (1)程序代码: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++)

编译原理词法分析和语法分析报告+代码(C语言版)

信息工程学院实验报告(2010 ~2011 学年度第一学期) 姓名:柳冠天 学号:2081908318 班级:083

词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 := + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码: 表2.1 各种单词符号对应的种别码 2.3 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

编译原理词法分析器语法分析课程设计报告书

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级 2011级 学号 20112723 姓名林苾湲 西南交通大学信息科学与技术学院 2013年 12月

目录 课程设计1 词法分析器 (2) 1.1 设计题目 (2) 1.2 设计容 (2) 1.3 设计目的 (2) 1.4 设计环境 (2) 1.5 需求分析 (2) 1.6 概要设计 (2) 1.7 详细设计 (4) 1.8 编程调试 (5) 1.9 测试 (11) 1.10 结束语 (13) 课程设计2 赋值语句的解释程序设计 (14) 2.1 设计题目 (14) 2.2 设计容 (14) 2.3 设计目的 (14) 2.4 设计环境 (14) 2.5 需求分析 (15) 2.6 概要设计 (16) 2.7 详细设计 (16) 2.8 编程调试 (24) 2.9 测试 (24) 2.10 结束语 (25)

课程设计一词法分析器设计 一、设计题目 手工设计c语言的词法分析器(可以是c语言的子集)。 二、设计容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 四、设计环境 该课程设计包括的硬件和软件条件如下: 4.1.硬件 (1)Intel Core Duo CPU P8700 (2)存4G 4.2.软件 (1)Window 7 32位操作系统 (2)Microsoft Visual Studio c#开发平台 4.3.编程语言 C#语言 五、需求分析 5.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 5.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、else、while、int、float等。 (4) 运算符:如+、-、*、<、>、=等。 (5)界符:如逗号、分号、括号等。 5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 5.4.可选择性地将结果保存到文件中。 六、概要设计 6.1.数据类型 6.1.1.单词的分类:本词法分析器演示的是C语言的一个子集,故字符集如下:

编译原理实验(词法分析)

编译原理实验报告 实验一 实验题目:词法分析 指导老师:任姚鹏 专业班级:计算机科学与技术系网络工程方向1002班姓名:xxxx

2013年 4月13日 实验类型__验证性__ 实验室_软件实验室三__ 一、实验项目的目的和任务: 了解和掌握词法分析的方法,编程实现给定源语言程序的词法分析器,并利用该分析器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其中的词法错误。 二、实验内容: 1.设计一个简单的程序设计语言(语言中有若干运算符和分界符;有若干关健字;若干标识符及若干常数) 2.确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。 3.把词法分析器设计成一个独立的过程。 三、实验要求: 1.从键盘上输入源程序; 2.处理各单词,计算个单词的值和类型; 3.输出个单词名、单词的值和类型。 四、实验代码 #include #include char file[1024]; int length=0; int index; char keywords[][10]={"auto","short","int","long","float", "double","char","struct","union","enum", "typedef","const","unsigned","signed","extern", "register","static","volatile","void","default", "if","else","switch","case","for", "do","while","goto","continue","break", "sizeof","return"}; char limits[]={'(',')','[',']','{','}',',',';'}; char operators[]={'+', '-', '*', '/', '%', '>','<','&','|','^', '~','!','='}; //13 int IsChar(char ch) //是否是字符 { if ( (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')) return 1; return 0;}

编译原理词法分析器

一、实验目的 了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA 编写通用的词法分析程序。 二、实验内容及要求 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 2.编写DFA模拟程序 算法如下: DFA(S=S0,MOVE[][],F[],ALPHABET[]) /*S为状态,初值为DFA的初态,MOVE[][]为状态转换矩阵,F[] 为终态集,ALPHABET[] 为字母表,其中的字母顺序与MOVE[][] 中列标题的字母顺序一致。*/ { Char Wordbuffer[10]=“”//单词缓冲区置空 Nextchar=getchar();//读 i=0; while(nextchar!=NULL)//NULL代表此类单词 { if (nextcha r!∈ALPHABET[]){ERROR(“非法字符”),return(“非法字符”);} S=MOVE[S][nextchar] //下一状态 if(S=NULL)return(“不接受”);//下一状态为空,不能识别,单词错误 wordbuffer[i]=nextchar ;//保存单词符号 i++; nextchar=getchar(); } Wordbuffer[i]=‘\0’;

编译原理词法分析程序实现实验报告

编译原理词法分析程序实现实验报告实验一词法分析程序实现 一、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。输入:由无符号数和+,,,*,/, ( , ) 构成的算术表达式,如 1.5E+2,100。输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。二、设计部分 因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下: 输入字符p指向第一个字符 符号识别*p=+||-||*||/ YYNN*p=0~9*p=E*p=0~9||"." N无效符号Y *p=“.”GOTO 2 GOTO 1 GOTO 1: NY无符号数GOTO 1*p=0~9*p='/0' YN P++NNP++*p=E*p='+'||'-' YY P++P++continue

YY *p=0~9*p=0~9 NN 无符号数无符号数 P++P++ continuecontinue GOTO 2: GOTO 2 *p=Econtinue Y 无符号数 P++ continue 三、源程序代码部分 #include #include #include #define MAX 100 #define UNSIGNEDNUMBER 1 #define PLUS 2 #define SUBTRACT 3 #define MULTIPLY 4 #define DIVIDE 5 #define LEFTBRACKET 6 #define RIGHTBRACKET 7 #define INEFFICACIOUSLABEL 8 #define FINISH 111

编译原理实验报告2-词法分析程序的设计

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

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

南华大学 计算机科学与技术学院实验报告 (2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号 专业班级 地点教师

1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以<种别码,值>的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符>::=<字母>|<标识符><字母>|<标识符><数字> <常数>::=<数字>|<数字序列><数字> <数字序列>::=<数字序列><数字>|<数字>|<.> <字母>::=a|b|c|……|x|y|z <数字>::=0|1|2|3|4|5|6|7|8|9 <运算符>::=<关系运算符>|<算术运算符>|<逻辑运算符>|<位运算符>|<赋值运算符> <算数运算符>::=+|-|*|/|...|-- <关系运算符>::=<|>|!=|>=|<=|== <逻辑运算符>::=&&| || |! <位运算符>::=&| | |! <赋值运算符>::==|+=|-=|/=|*= <分界符>::=,|;|(|)|{|}|:| // |/**/ <保留字>::=main|if|else|while|do|for|...|void

编译原理词法分析及语法分析

编译原理 实验报告 实验名称:词法分析及语法分析专业班级: 姓名: 学号: 完成日期:

实验一、sample语言的词法分析 一、实验目的 给出SAMPLE文法规范,要求编写SAMPLE语言的词法分析程序。 二、实验准备 了解sample语言单词的定义,选择任一种编程语言实现词法分析。 三、实验内容 给出SAMPLE语言文法,输出单词(关键字、专用符号以及其它标记)。 1、格式 输入:源程序文件。输出:关键字、专用符号以及其它标记。 2、实现原理 程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码,用以区分之。 3、实验方法 读懂Sample源代码,自己重点独立实现对常量的判别。 四、实验设计 1、设计SAMPLE语言的词法分析器 A、字符集定义 1. <字符集> → <字母>│<数字>│<单界符> 2. <字母> → A│B│…│Z│a│b│…│z 3. <数字> → 0│1│2│…│9 4. <单界符> → +│-│*│/│=│<│>│(│)│[│]│:│. │; │, │' B、单词集定义 5.<单词集> → <保留字>│<双界符>│<标识符>│<常数>│<单界符> 6.<保留字> → and│array│begin│bool│call│case│char│constant│dim│do│else │end│false│for│if│input│integer│not│of│or│output│procedure│program │read│real│repeat│set│stop│then│to│true│until│var│while│write 7.<双界符> → <>│<=│>=│:= │/*│*/│.. 8.<标识符> → <字母>│<标识符> <数字>│<标识符> <字母> 9.<常数> → <整数>│<布尔常数>│<字符常数> 10.<整数> → <数字>│<整数> <数字> 11.<布尔常数> → true│false 12.<字符常数> → ' 除 {'} 外的任意字符串 ' 2、词法分析系统流程设计

(完整版)《编译原理》词法分析程序设计方案

实验1-4 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA 编写通用的词法分析程序。 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 2.编写DFA模拟程序 算法如下: DFA(S=S0,MOVE[][],F[],ALPHABET[]) /*S为状态,初值为DFA的初态,MOVE[][]为状态转换矩阵,F[] 为终态集,ALPHABET[] 为字母表,其中的字母顺序与MOVE[][] 中列标题的字母顺序一致。*/ { Char Wordbuffer[10]=“”//单词缓冲区置空 Nextchar=getchar();//读 i=0; while(nextchar!=NULL)//NULL代表此类单词 { if (nextcha r!∈ALPHABET[]){ERROR(“非法字符”),return(“非法字符”);} S=MOVE[S][nextchar] //下一状态 if(S=NULL)return(“不接受”);//下一状态为空,不能识别,单词错误 wordbuffer[i]=nextchar ;//保存单词符号 i++; nextchar=getchar(); } Wordbuffer[i]=‘\0’; If(S∈F)return(wordbuffer);//接受 Else return(“不接受”);

相关主题
文本预览
相关文档 最新文档