编译原理实验 词法分析&语法分析程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验

实验一:词法分析程序

1、实验目的

从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。

2、实验内容

表C语言子集的单词符号及内码值

单词符号种别编码助记符内码值

while 1 while --

if 2 if --

else 3 else --

switch 4 switch --

case 5 case --

标识符 6 id id在符号表中的位置

常数7 num num在常数表中的位置

+ 8 + --

- 9 - --

* 10 * --

<= 11 relop LE

< 11 relop LT

== 11 relop LQ

= 12 = --

; 13 ; --

输入源程序如下

if a==1 a=a+1;

else a=a+2;

输出对应的单词符号形式的中间程序

3、实验过程

实验上机程序如下:

#include "stdio.h"

#include "string.h"

int i,j,k;

char s ,a[20],token[20];

int letter()

{

if((s>=97)&&(s<=122))return 1;

else return 0;

}

int Digit()

{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()

{

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 you source program,end('#'):\n");

i=0;

do

{

i=i+1;

scanf("%c",&a[i]);

}while(a[i]!='#');

i=1;

memset(token,0,sizeof(char)*10);

j=0;

get();

while(s!='#')

{

if(s==' '||s==10||s==13)

get();

else

{

switch(s)

{

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':

while(Digit()||letter())

{

token[j]=s;

j=j+1;

get();

}

retract();

k=lookup();

if(k==0)

printf("(6,%s)\n",token); else

printf("(%d,null)\n",k); break;

case'0':

case'1':

case'2':

case'3':

case'4':

case'5':

case'6':

case'7':

case'8':

case'9':

while(Digit())

{

token[j]=s;

j=j+1;

get();

}

retract();

printf("(%d,%s)\n",7,token); break;

case'+':printf("(+,null)\n"); break;

case'-':printf("(-,null)\n"); break;

case'*':printf("(*,null)\n"); break;

case'<':

get();

if(s=='=')

printf("(relop,LE)\n"); else

{

retract();

printf("(relop,LT)\n");

}

break;

case'=':

get();

if(s=='=')

printf("(relop,EQ)\n"); else

{

retract();

printf("(=,null)\n");

}

break;

case';':printf("(;,null)\n"); break;

default:printf("(%c,error)\n",s);

相关文档
最新文档