词法分析实验报告(实验一)

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

编译原理词法分析实验报告

软工082班

兰洁

200831104044

一、实验内容

二、实验目的

三、实验预期

四、程序规定

五、实验原理

●程序流程图

●判别浮点功能扩展流程图

●状态转换图

六、程序代码与浮点判别功能扩展

七、测试用例

●扩展功能测试用例;

●普通功能测试用例

八、输出结果

九、实验心得

一、实验内容:

词法分析:

1、识别简单语言的单词符号;

2、识别关键字、标识符、数字、运算符等。并扩展浮点识别功能。

二、实验目的

调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。

三、实验预期结果:

经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。

四、程序规定:

1、关键字:"function","if","then","while","do","endfunc";

2、算术运算符:”+”,”-”,”*”,”/”,”=”;

3、关系运算符:"<" ">" "<=" ">=" "==" "!=";

4、界符:"(" ")" ";" "#";

5、标识符规定以字母开头,字母均为小写;

6、空格和换行符跳过;

7、单词对应编码:

十、实验原理:

输入串--------------------〉词法分析程序————————〉单词符号串

输入:字符串以#结束。

输出:单词的二元组(syn,token/sum)

程序流程图

分析浮点数功能扩展部分流程图:

shuzi()函数

状态转换图

六、程序代码:

备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数!

我把浮点数的syn设置为80!

/*词法分析源代码*/

#include

#include

scaner();

char prog[80],token[8];

char ch;

int syn,p,m,n,sum;

char * rwtab[6]={"function","if","then","while","do","endfunc"}; int i=0,k,c,sumint,f;

char fenshu[80],sum1[80];

double sumf=0,fudian;

int shuzi(){

if(ch>='0' && ch<='9')

syn=80;

else

syn=-2;

return syn;}

main()

{p=0;

printf("\n please input string :\n");

do{

scanf("%c",&ch);

prog[++p]=ch;}

while(ch!='#');

p=0;

do

{

scaner();

switch(syn)

{ case 11:printf("\n(%d,%d)",syn,sum);break;

case -1:printf("\n error");break;

case 80:printf("\n(%d,%f)",syn,fudian);break; default:printf("\n(%d,%s)",syn,token);

}

}while(syn!=0);

}

scaner()

{

for(n=0;n<8;n++)

token[n]=NULL;//if(1+2!=3)

ch=prog[++p];

while(ch==' ' || ch=='\n')

ch=prog[++p];//跳过空格

if(ch>='a' && ch<='z')

{

m=0;

while(ch>='a' && ch<='z' || ch>='0' && ch<='9') {

token[m++]=ch;//token[0]=f,m=1

ch=prog[++p];

}

token[m]='\0';

ch=prog[--p];

syn=10;

for(n=0;n<6;n++){

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;

break;

}

}

}

else

if(ch>='0' && ch<='9')

{

c=p;

k=0;

do

{ sum1[k]=ch;

ch=prog[++c]; //ch取后一个数字

k++;

shuzi();//这个函数用来分析浮点数的整数部分是否已经输入到数组里

f=syn;

} while(f==80)

if(ch=='.')

{

for(n=0;n

{

sumint=sumint*10+sum1[n]-'0';

} //计算整数部分

i=0;

do

{

ch=prog[++c];

fenshu[i]=ch;

i++;

相关文档
最新文档