实验指导书-编译原理 下载本文

内容发布更新时间 : 2024/5/21 17:46:00星期一 下面是文章的全部内容请认真阅读。

实验一:词法分析

一、实验目的

给出PL/0文法规范,要求编写PL/0语言的词法分析程序。 二、实验准备

微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C++。 三、实验时间 4学时 四、实验内容

已给PL/0语言文法,输出单词(关键字、专用符号以及其它标记)。 二.实验内容 1、格式

输入:源程序文件。 输出:关键字、专用符号以及其它标记。 2、编译对象:

包含如下基本内容 1) 变量说其它标记: 明语句 2) 赋值语句 3) 条件转移语句 4) 表达式(算术表达式和逻辑表达式) 5) 循环语句 6) 过程调用语句 3、 实现过程

本次实验所用的语言为标准C,以下同。本功能实现的主函数为getToken函数。通过从文件中读取字符到缓冲区中并由C语言字符的状态转换图流程判断返回一个字符(Token)。分析出来的Token主要分为关键字,专用符号,标记符号。 本实验实现的C语言的基本词法如下: 关键字: els if int return void while

专用符号: + - * / < >= == != = ; , ( ) [ ] { } /* */ 其它标记: id num ID = letter letter* NUM = digit digit*

letter = a|b|...|z|A|B|...|Z| ditit= 0|1|...|9

通过在C语言中定义一个枚举类型来识别这些符号: PL/0语言的EBNF表示 <常量定义>::=<标识符>=<无符号整数>; <标识符>::=<字母>={<字母>|<数字>}; <加法运算符>::=+|- <乘法运算符>::=*|/

<关系运算符>::==|#|<|<=|>|>= <字母>::=a|b|?|X|Y|Z <数字>::=0|1|2|?|8|9 4、主体结构的说明

在这里说明部分告诉我们使用的LETTER,DIGIT, IDENT(标识符,通常定义为字母开头的字母数字串)和STR(字符串常量,通常定义为双引号括起来的一串字符)是什么意思.这部分也可以包含一些初始化代码.例如用#include来使用标准的头文件和前向说明(forward ,references).这些代码应该再标记\和\之间;规则部分>可以包括任何你想用来分析的代码;我们这里包括了忽略所有注释中字符的功能,传送ID名称和字符串常量内容到主调函数和main函数的功能. 5、实现原理

程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码,用以区分之。 三:设计过程

1

1. 关键字:void,main,if,then,break,int,Char,float,include,for,while,printfscanf 并为小写。

2.\”;”-”;”*”;”/”;”:=“;”:”;”<“;”<=“;”>“;”>=“;”<>“;”=“;”(“;”)”;”;”;”#”为运算符。

3. 其他标记 如字符串,表示以字母开头的标识符。 4. 空格符跳过。 5. 各符号对应种别码 关键字分别对应1-13

运算符分别对应401-418,501-513。 字符串对应100 常量对应200 结束符#

四:举例说明

目标:实现对常量的判别 代码:

digit [0-9] letter [A-Za-z] other_char [!-@\\[-~]

id ({letter}|[_])({letter}|{digit}|[_])* string {({letter}|{digit}|{other_char})+} int_num {digit}+ %%

[ |\\t|\\n]+

\gister\igned\atic\\\\-?{int_num}[.]{int_num}?([E][+|-]?{int_num})? {printf(\

\

\|\=\{id} {printf(\

{digit}({letter})+ {printf(\%%

#include Upper(char *s,int l) {

int i;

for(i=0;i

s[i]=toupper(s[i]); } }

yywrap() {

return 1; }

五:源程序:

2

#include #include #include #include

int i,j,k,flag,number,status;

/*status which is use to judge the string is keywords or not!*/ char ch;

char words[10] = {\char program[500];

int Scan(char program[]) {

char *keywords[13] = {\ \\number = 0; status = 0;

j = 0;ch = program[i++]; /* To handle the lettle space ands tab*/

/*handle letters*/

if ((ch >= 'a') && (ch <= 'z' )) {

while ((ch >= 'a') && (ch <= 'z' )) {

words[j++]=ch; ch=program[i++]; }

i--;

words[j++] = '\\0';

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

if (strcmp (words,keywords[k]) == 0) flag = 5; switch(k) status = 1; { break; case 0:{ } flag = 1; case 5:{ status = 1; flag = 6; break; status = 1; } break; case 1:{ } flag = 2; case 6:{ status = 1; flag = 7; break; status = 1; } break; case 2:{ } flag = 3; case 7:{ status = 1; flag = 8; break; status = 1; } break; case 3:{ } flag = 4; case 8:{ status = 1; flag = 9; break; status = 1; } break; case 4:{ }

3