当前位置:文档之家› 词法分析器实验报告样例

词法分析器实验报告样例


设计思想: 设计该词法分析器的过程中虽然没有实际将所有的状态转 移表建立出来,但是所用的思想是根据状态转移表实现对单词 的识别。首先构造一个保留字表,然后,每输入一个字符就检测 应该进入什么状态,并将该字符连接到d串后继续输入,如此循 环,最后根据所在的接受状态以及保留字表识别单词。 符号表: 记号 类别
*
other other
③关系操作符: start < other =
(<=, 2)
> =
other > =
* * (<>, 2) (<,2) (=, 2) (>=, 2) (>, 2)
: =
(:=,2)
④分隔符:
start
; ( ) , .
( ; ,5) ( (,5) ( ),5) ( , ,5) ( . ,5)
3,a 5,; 1,end 5,;
测试结果与预期结果一致
源程序代码:
#include<stdio.h> #include<string.h> void main() { int i=0,j,k=0,state=1,f=0,linenum=1; char a[11][10]= {"const","var","call","begin","if","while","do","odd","end","then","proc char b,d[40]={"\0"}; freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); b=getchar(); while(b!=EOF)/*判断所输入字符是否为结束符*/ { if(b==' '||b=='\n'||b=='\t')/*滤过空格、换行等分隔符号 */ { if(b='\n') linenum++; b=getchar(); } else if((b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*识别标识符 以及保留字*/ { d[i++]=b; b=getchar(); while((b>='a'&&b<='z')||(b>='A'&&b<='Z')|| (b>='0'&&b<='9')) { d[i++]=b; b=getchar(); } for(j=0;j<11;j++)/*查询保留字表确定该单词是否是保留 字*/ { if(strcmp(d,a[j])==0)
state=3; d[i++]=b; b=getchar();} else if(b=='E') { state=4;d[i++]=b;b=getchar();} else state=7; break; case 4: if(b=='+'||b=='-') { state=5;d[i++]=b;b=getchar();} else if(b>='0'&&b<='9'){ state=6;d[i++]=b;b=getchar();} else state=8; break; case 5: if(b>='0'&&b<='9'){ state=6;d[i++]=b;b=getchar();} else state=8; break; case 6: if(b>='0'&&b<='9'){ state=6;d[i++]=b;b=getchar();} else state=7; break; case 7: f=1;break; case 8: f=1;break; } } if(state==7&&(b<'a'||b>'z')&&(b<'A'||b>'Z')) printf("4,%s\n",d); else if(state==7&&(b>='a'&&b<='z')||(b>='A'&&b<='Z'))/* 数字后接字母的出错控制*/ { while((b>='a'&&b<='z')||(b>='A'&&b<='Z')) { d[i++]=b; b=getchar(); }
保留字 保留字 保留字 保留字 保留字 保留字 保留字 保留字 保留字 保留字 保留字 运算符 运算符
属性值
ws const var call begin if while do odd end then procedure = <
1 1 1 1 1 1 1 1 1 1 1 2 2
<= <> > >= * + / := ident number ( ) ; , . 状态转换图:
printf("error line %d\n",linenum); } else printf("error line %d\n",linenum); for(j=0;j<=i;j++) d[j]='\0'; i=0; f=0; state=1; } else if(b=='<')/*识别'<'、'<='和'<>'*/ { d[i++]=b; b=getchar(); if(b=='='||b=='>') { d[i++]=b; b=getchar(); printf("2,%s\n",d); for(j=0;j<=i;j++) d[j]='\0'; i=0; } else { printf("2,%s\n",d); for(j=0;j<=i;j++) d[j]='\0'; i=0; } } else if(b=='>')/*识别'>'和'>='*/ { d[i++]=b; b=getchar(); if(b=='=') { d[i++]=b; b=getchar(); printf("2,%s\n",d); for(j=0;j<=i;j++) d[j]='\0';
词法分析器实验报告
姓名: 学号: 日期:
实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深 对词法分析原理的理解。 功能描述: 该程序要实现的是一个读单词过程,从输入的源程序中, 识别出各个具有独立意义的单词,即基本保留字、标识符、常 数、运算符、分隔符五大类。并依次输出各个单词的内部编码 及单词符号自身值。(遇到错误时可显示“Error!”,然后 跳过错误部分继续进行)
①标识符及保留字:
Start letter
运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 标识符 常数 分隔符 分隔符 分隔符 分隔符 分隔符
2 2 2 2 2 2 2 2 2 3 4 5 5 5 5 5
lettr:
7 0 2 1 4 3 6 5 start other digit . digit E +|digit digit digit digit E digit
⑤算术运算符: start
+ * / ( + ,2) ( -,2) ( *,2) ( / ,2)
使用环境: Windows xp下的visual c++6.0 程序测试: input1 : int a,b; a=b+2; input2: while(a>=0) do 7x=x+6.7E+23; end; input3: begin: x:=9 if x>0 then x:=x+1; while a:=0 do b:=2*x/3,c:=a; end;
{
printf("1,%s\n",d); k=1; break;
} } if(k==0)/*在保留字表中没有查到该单词,是标识符*/ printf("3,%s\n",d); for(j=0;j<=i;j++) d[j]='\0'; i=0; k=0; } else if(b>='0'&&b<='9')/*识别常数*/ { d[i++]=b; b=getchar(); while(f!=1){ switch (state) { case 1: if(b>='0'&&b<='9') { state=1; d[i++]=b; b=getchar();} else if(b=='.') { state=2;d[i++]=b;b=getchar();} else if(b=='E') { state=4;d[i++]=b;b=getchar();} else state=7; break; case 2: if(b>='0'&&b<='9') { state=3; d[i++]=b; b=getchar();} else state=8; break; case 3: if(b>='0'&&b<='9') {
相关主题