河工大版编译原理实验报告

更新时间:2024-04-28 10:20:01 阅读量: 综合文库 文档下载

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

(此文档为word格式,下载后您可任意编辑修改!)

原理实验报

学院: 国际教育学院 专业: 中法计算机合作专业 班级: 中法计122 姓名: 徐彤坤 学号: 122930

1 告

目录

实验一 词法分析程序实现........................................................................................................... 3

实验设计:............................................................................................................................... 3 实验步骤................................................................................................................................... 3

基本思路: ....................................................................................................................... 6 程序代码:............................................................................................................................... 6 实验结果分析:..................................................................................................................... 13 自我评鉴................................................................................................................................. 14 实验二 语法分析程序实现......................................................................................................... 15

实验设计:............................................................................................................................. 15 实验步骤................................................................................................................................. 15

基本思路 ......................................................................................................................... 15 程序代码................................................................................................................................. 17 实验结果分析......................................................................................................................... 23

2

实验一 词法分析程序实现

实验设计:

实验目的与要求

通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词符号组成的流的词法分析方法。

基本实验题目

题目:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符。

实验步骤

单词的分类:

构造上述语言中的各类单词符号及其分类码表。 单词符号 begin end if then else 标识符 无符号常数 < <= 类别编码 1 2 3 4 5 6 7 8 9 类别码的助记符 BEGIN END IF THEN ELSE ID UCON LT LE 单词值 字母打头的字母数字串 机内二进制表示 3 = <> > >= := + - * 10 11 12 13 14 15 16 17 18 EQ NE GT GE IS PL MI MU DI 表I 语言中的各类单词符号及其分类码表

图I 识别表I所列语言中的部分单词的DFA及相关的语义过程

图I中所出现的语义变量及语义函数的含义和功能说明如下:

? 函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量

ch,然后把扫描指示器前推一个字符位置。

? 字符数组TOKEN:用来依次存放一个单词词文中的各个字符。

? 函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。 ? 函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关

键字的类别码赋给整型变量c;否则将c置为零。

? 函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字

符)。

? 函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。其中,实参

c为相应单词的类别码或其助记符;实参VAL为TOKEN(即词文)或为空串。函数OUT的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。 需要将程序一中的整常数扩展为无符号常数,以满足题目的要求。描述无符号数的右线性文法G1[<无符号数>]如下:

〈无符号数〉→ d〈余留无符号数〉

4 〈无符号数〉→ ·〈小数部分〉 〈无符号数〉→ d

〈余留无符号数〉→ d〈余留无符号数〉 〈余留无符号数〉→ ·〈十进小数〉 〈余留无符号数〉→ E〈指数部分〉 〈余留无符号数〉→ d 〈余留无符号数〉→ · 〈十进小数〉→ E〈指数部分〉 〈十进小数〉→ d〈十进小数〉 〈十进小数〉→ d

〈小数部分〉→ d〈十进小数〉 〈小数部分〉→ d

〈指数部分〉→ d〈余留整指数〉 〈指数部分〉→ +〈整指数〉 〈指数部分〉→ -〈整指数〉 〈指数部分〉→ d

〈整指数〉→ d〈余留整指数〉 〈整指数〉→ d

〈余留整指数〉→ d〈余留整指数〉 〈余留整指数〉→ d

图II所示为上述文法的状态转换图,其中编号0、1、2、?、6分别代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>。

图II 文法G1[<无符号数>]的状态转换图

表II 包含语义处理过程的识别无符号数的状态矩阵

5

基本思路:

程序代码:

#include

TOKEN[0]=ch; ch=fgetc(fp); i=1;

while(isdigit(ch)||ch == '.' || ch == 'E'||ch == 'e') {

if (ch == '.'){checkdot =1;} else if (ch == 'e'||ch == 'E') {

checke = 1; TOKEN[i]=ch; i++; ch=fgetc(fp);

if(ch == '+'){TOKEN[i]=ch; i++; ch=fgetc(fp); {

TOKEN[i]=ch; i++; ch=fgetc(fp); continue; } } else

{TOKEN[i]=ch;

6 e的指数 小数 i++; ch=fgetc(fp); {

TOKEN[i]=ch; i++; ch=fgetc(fp); continue; } }

*if (ch == '-')TOKEN[i]=ch; i++; ch=fgetc(fp); {

TOKEN[i]=ch; i++; ch=fgetc(fp); continue; }* }

TOKEN[i]=ch; i++; ch=fgetc(fp); }

TOKEN[i]= '\\0'; fseek(fp,-1,1); if(checkdot==1) {

out(UCON,TOKEN); }

else if (checke == 1)

7 {

out(UCON,TOKEN);二进制数 } else {

out(INT,TOKEN);整型 } }

else {

case '<': ch = fgetc(fp);

if (ch == '=')out(LE, \else if (ch == '>') out(NE, \else {

fseek(fp, -1, 1);TOKEN[i]=ch;

switch (ch) 输出

i++; ch=fgetc(fp);

} break;

out(LT, \

case '=': out(EQ, \

case ':': ch = fgetc(fp); if (ch == '=')out(IS, \ else {

fseek(fp,-1,1); report_error( ); }

8 break;

case '>': ch = fgetc(fp);

if (ch == '=')out(GE, \else { } break;

fseek(fp, -1, 1); out(GT, \

case '+':out(PL,\ case '-':out(MI,\

case '*':out(MU,\case '':out(DI,\

case '\\n': break; fseek(fp, -1, 1);report_enter(); break;

case '\\r' :out(ENT,\

}

ch=fgetc(fp);

case ' ': break; case '\\t': break;

default: report_error(); break;

t=fgetc(fp); }

char *KeyWordTable[MAX_KEY_NUMBER] = { \\关键字 int lookup(char *token) {

int n = 0;

9

fseek (fp,-1,1);

}

return;

while (strcmp(KeyWordTable[n], KEY_WORD_END)) *strcmp比较两串是

否相同,若相同返回0*

{

if (!strcmp(KeyWordTable[n], token)) *比较token所指向的关键字和保

留字表中哪个关键字相符*

{

return n + 1; *根据单词分类码表I,设置正确的关键字类别码,并

返回此类别码的值* }

void report_error(){ }

void out(int c, char* v){

char* cl = \switch (c) { case case case case case case

1: cl = \

2: cl = \3: cl = \

printf(\ }

return 0; *单词不是关键字,而是标识符*

} n++;

break;

4: cl = \

5: cl = \6: cl = \7: cl = \8: cl = \9: cl = \

10 case case case

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

Top