《编译原理》(实验部分)
实验2_PL0词法分析
一、实验目的
加深和巩固对于词法分析的了解和掌握;初步认识PL/0语言的基础和简单的程序编写;通过本实验能够初步的了解和掌握程序词法分析的整个过程;提高自己上机和编程过程中处理具体问题的能力。
二、实验设备
1、PC 兼容机一台;操作系统为WindowsWindowsXP。
2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。
三、实验原理
PL/O语言的编译程序,是用高级语言PASCAL语言书写的。整个编译过程是由一些嵌套及并列的过程或函数完成。词法分析程序是独立的过程GETSYM完成,供语法分析读单词时使用。
四、实验步骤
阅读所给出的词法分析程序(pl0_lexical.c),搞懂程序中每一个变量的含义,以及每一个过程的作用,并在该过程中进行中文注释;阅读完程序后,画出各过程的流程图;给出的程序包含两处输入错误,利用所给的pl/0源程序(test.pl0)对程序进行调试,使其能正确对所给文件进行分析并能够解释运行;在阅读懂所给出的词法分析程序后,将你对词法分析的理解写在实验报告上。
实验代码 #include
{ printf (\
主程序:
#include
char *key[8]={\ char *border[6]={\ char *arithmetic[4]={\
char *relation[6]={\ char *consts[20]; char *label[20];
int constnum=0,labelnum=0;
int search(char searchchar[],int wordtype) { int i=0;
switch (wordtype) { case 1:for (i=0;i<=7;i++) {
if (strcmp(key[i],searchchar)==0) return(i+1); };
case 2:{for (i=0;i<=5;i++) {
if (strcmp(border[i],searchchar)==0) return(i+1); };
return(0); }
case 3:{for (i=0;i<=3;i++)
{ if (strcmp(arithmetic[i],searchchar)==0) {
return(i+1); }; };
return(0); };
case 4:{for (i=0;i<=5;i++)
{ if (strcmp(relation[i],searchchar)==0) {
return(i+1); }; };
return(0); };
case 5:{for (i=0;i<=constnum;i++)
{ if (strcmp(consts[i],searchchar)==0) {
return(i+1); }; }
consts[i-1]=(char *)malloc(sizeof(searchchar)); strcpy(consts[i-1],searchchar); constnum++; return(i); };
case 6:{for (i=0;i<=labelnum;i++)