v1.0 可编辑可修改
编译原理实验报
告
一、
任务概述
本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分
组员: 韦廷廷
析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。
(112455)、熊敏(112456)、马昊(113042)
二、系统设计
实验采用的实现方法和依据:
任课老师:吴 语言中的各类单词符清
1
号及其分类码表
单词符号 类别编码 类别码的助记符 begin end if then else 标识符 1 2 3 4 5 6 BEGIN END IF THEN ELSE ID 单词值 字母打头的字母数字串 v1.0 可编辑可修改 无符号常数 < <= = <> > >= := + - * / 7 8 9 10 11 12 13 14 15 16 17 18 UCON LT LE EQ NE GT GE IS PL MI MU DI 机内二进制表示 4 5 6 7 S4 S4 S4 S4 S4 R8 S15 R1 R2 R4 R5 R7 R8 S6 R1 R2 R4 R5 R7 R8 S7 R1 R2 R4 R5 R7 R8 S8 S8 R4 R5 R7 R8 S9 S9 R4 R5 R7 S5 S5 S5 S5 S5 R8 R1 R2 R4 R5 R7 8 9 10 11 12 13 14 15 三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)
(1)各.h和.c文件说明 的功能:字符串扫描识别。
实验采用的实现方法和依据:
的功能:存放SLR分析法需要用到的ACTION
文法:E → T | E+T | E-T T → F | T*F | T/F 和GOTO表。 F → i | (E)
的功能:引用、两个文件进行语法、语义的
SLR(1)分析表
分析。
ACTION ( S4 状态 0 1 2 3 (2)函数功能说明 GOTO F ) R3 R6 + S6 R3 R6 - S7 R3 R6 * S8 R6 词法分析部分函数说明:/ i # E T return POINT; S5 1 2 3 int lookup (char *token) Acc if (c=='E'||c=='e') return POWER; S9 R3 if (c=='+') return PL; R6 R6 2
if (c=='-') return MU; return OTHER; }
void report_error( ) {
printf(\错误\\n\ }
void out1(int a,char *token) { i=0;
EXCUTE(CurrentState,POINT);
if (ch=='E'||ch=='e')
EXCUTE(CurrentState,POWER);
if (ch=='+')EXCUTE(CurrentState,PL) ; if (ch=='-') EXCUTE(CurrentState,MU); while(CurrentState!=EndState) { TOKEN[i]=ch; i++;
ch=fgetc(fp);
int c=GetChar(ch);
EXCUTE(CurrentState,c);
}
TOKEN[i]='\\0';
fseek(fp,-1,1);
// printf(\
3
v1.0 可编辑可修改 result=out(UCON);
}
else switch(ch) //关系运算符 {
case '<': ch=fgetc(fp); if(ch=='=')out1(LE,\ else if(ch=='>') out1 (NE,\ else
{
fseek (fp,-1,1);
printf(\算术表达式不需要\\n\
// out (UCON);
}
break;
case '=': printf(\算术表达式不需要\\n\ //out(EQ, \
break;
case '>': ch=fgetc(fp); if(ch=='=') {
printf(\算术表达式不需要\\n\
//out(GE,\
}
else
{
fseek(fp,-1,1);
printf(\算术表达式不需要\\n\
//out(GT,\
}
break; case ':':ch=fgetc(fp); if(ch=='=') { printf(\算术表达式不需要\\n\ //out(IS,\ }
break;
case '+':result=out(PL);
break;
case '-':result=out(MI);
break;
case '*':result=out(MU);
break;
case '/':result=out(DI);
break;
case '(':result=out(zuokuohao);break; case ')':result=out(youkuohao);break; case ';':result=out(jin);break; case EOF:break;
default:report_error(); break;
} return; }
int EXCUTE (int state, int symbol)
4
v1.0 可编辑可修改 {
switch (state) {
case 0:switch (symbol) { case
DIGIT:
n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON;break;
case
POINT:
w=0;n=0;p=0;e=1;CurrentState=3;Class=UCON;break;
default:
HandleOtherWord( );Class=ClassOther; CurrentState=EndState;
}
break;
case 1:switch (symbol) { case DIGIT:
w=w*10+d;break;
//CurrentState=1
case POINT: CurrentState=2;break; case POWER: CurrentState=4;break; default:
FCON=w;CurrentState=EndState; } break;
case 2:switch (symbol)
{
case DIGIT: n++;w=w*10+d;break; case POWER: CurrentState=4;break; default:
FCON=w*pow(10,e*p-n);CurrentState=EndState; } break;
case 3:switch (symbol) { case
DIGIT:
n++;w=w*10+d;CurrentState=2;break; default:
HandleError( );CurrentState=EndState; } break;
case 4:switch (symbol) { case
DIGIT: p=p*10+d;CurrentState=6;break; case
MU: e=-1;CurrentState=5;break;
case PL: e=1;CurrentState=5;break; default:
HandleError( );CurrentState=EndState; } break;
case 5:switch (symbol)
5
v1.0 可编辑可修改 { case
DIGIT:
p=p*10+d;CurrentState=6;break; default:
HandleError( );CurrentState=EndState; } break;
case 6:switch (symbol) {
case DIGIT: p=p*10+d;break; default:
FCON=w*pow(10,e*p-n);CurrentState=EndState; } break; }
return CurrentState; }
int cifa(FILE *fp) { CurrentState=0;//初始0状态 scanner_example (fp) ; return(result);
}