编译原理词法分析实验报告含可运行源码文档格式.docx

上传人:b****2 文档编号:5731133 上传时间:2023-05-05 格式:DOCX 页数:24 大小:233.72KB
下载 相关 举报
编译原理词法分析实验报告含可运行源码文档格式.docx_第1页
第1页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第2页
第2页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第3页
第3页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第4页
第4页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第5页
第5页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第6页
第6页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第7页
第7页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第8页
第8页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第9页
第9页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第10页
第10页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第11页
第11页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第12页
第12页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第13页
第13页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第14页
第14页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第15页
第15页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第16页
第16页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第17页
第17页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第18页
第18页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第19页
第19页 / 共24页
编译原理词法分析实验报告含可运行源码文档格式.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

编译原理词法分析实验报告含可运行源码文档格式.docx

《编译原理词法分析实验报告含可运行源码文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验报告含可运行源码文档格式.docx(24页珍藏版)》请在冰点文库上搜索。

编译原理词法分析实验报告含可运行源码文档格式.docx

10)isNegative整数,是否为负数幂。

isNegative为1,则为负数幂,如123E-2。

11)

scanner()扫描子程序。

12)getchar()从控制台读取一个字符数据。

13)doublepow(doublex,doubley),计算x的y次幂。

14)intstrcmp(char*str1,char#str2),字符串比较。

 

三流程框图

主程序

扫描子程序

四函数相关说明

1.接收用户输入:

getchar()和do…while循环的组合

do{

ch=getchar();

prog[p++]=ch;

}while(ch!

='

#'

);

//输入以#号键结束

2.输出到控制台:

do…while循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。

scanner();

//扫描,单词

switch(syn)

{

case11:

if((isDecimal==0)&

&

(isExp==0))

{

//加了1个强制类型转换

printf("

(%2d,%8d)\n"

syn,(int)sum);

break;

}

if(isExp==1)

(%2d,%g)\n"

syn,sum);

isExp=0;

isDecimal=0;

elseif(isDecimal==1)

(%2d,%8.4f)\n"

elsebreak;

case-1:

printf("

UNKNOWNERROR\n"

break;

case90:

%8s小数格式不正确\n"

token);

case91:

%s指数格式不正确\n"

case99:

//syn=99时即判断为注释

default:

(%2d,%8s)\n"

syn,token);

}

}while(syn!

=0);

3.浮点数的识别,先识别数字,再识别.,再识别数字,再识别E或e,再识别-,再识别数字。

elseif((ch>

0'

)&

(ch<

9'

))

{k=0;

while((ch>

sum=sum*10+ch-'

;

//ch中数字本身是当做字符存放的

token[k++]=ch;

ch=prog[p++];

if(ch=='

.'

isDecimal=1;

if(!

(ch>

ch<

token[k++]=ch;

syn=90;

//小数格式不正确

else

while((ch>

{

//pow(x,y)计算x的y次幂

temp=(ch-'

)*pow(0.1,++count);

decimal=decimal+temp;

//AddToDec();

token[k++]=ch;

ch=prog[p++];

}

sum=sum+decimal;

if(((ch=='

e'

)||(ch=='

E'

))&

(syn!

=90))

isExp=1;

if(ch!

)token[k++]=ch;

if(ch=='

-'

isNegative=1;

ch=prog[p++];

if(ch!

+'

isNegative=0;

))syn=91;

while((ch>

=91))

//指数

index=index*10+ch-'

//10的幂

//123e3代表123*10(3)

//sum=sum*pow(10,index);

是错误的

if(syn!

=91)

if(isNegative)

sum=sum*pow(0.1,index);

else

sum=sum*pow(10.0,index);

if(syn!

=90)

{

if(isSignal==1)

sum=-sum;

isSignal=0;

=91){syn=11;

p=p-1;

}

if(prog[p-1]=='

)p=p-1;

}

4.注释的识别与过滤,识别到‘/’符号的时候进行判断,如若紧跟*符号则判断为注释,p指针不断后移知道读取到*/为止

case'

/'

:

if(prog[p]!

*'

syn=25;

token[m++]=ch;

do

{

p++;

}while(!

((prog[p]=='

(prog[p+1]=='

)));

p=p+2;

ch=prog[p];

syn=99;

break;

五输入与输出

词法分析程序需具备词法分析的功能:

输入:

所给文法的源程序字符串。

(字符串以“#”号结束)

输出:

二元组(syn,token或sum)构成的序列。

其中:

syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

六程序运行截图

七词法分析器使用说明

用户输入待识别字符串(并以“#”结尾,表示字符串输入结束),回车后程序自动输出词法分析结果。

八心得与体会

词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

通过本试验的完成,更加加深了对词法分析原理的理解。

九源程序清单

#include<

stdio.h>

string.h>

math.h>

iostream>

charprog[180];

//存放所有输入字符

chartoken[20];

//存放词组

charch;

//单个字符

intsyn,p,m,n;

//syn:

种别编码

doublesum;

intcount;

intisSignal;

//是否带正负号(0不带,1负号,2正号)

intisDecimal;

//是否是小数

doubledecimal;

//小数

intisExp=0;

//是否是指数

intindex;

//指数幂

intisNegative;

//是否带负号

doubletemp;

inttemp2;

intk;

voidscanner();

char*rwtab[9]={"

main"

int"

float"

double"

char"

else"

voidmain()

{

p=0;

count=0;

isDecimal=0;

index=0;

printf("

\nPleaseinputstring:

\n"

system("

pause"

voidscanner()

sum=0;

decimal=0;

m=0;

for(n=0;

n<

20;

n++)

token[n]=NULL;

ch=prog[p++];

//从prog中读出一个字符到ch中

while((ch=='

'

\n'

\t'

))//跳过空字符(无效输入)

ch=prog[p++];

if(((ch>

a'

z'

))||((ch>

A'

Z'

)))//ch是字母字符

{

while(((ch>

)))

token[m++]=ch;

//ch=>

token

//读下一个字符

token[m++]='

\0'

p--;

//回退一格

syn=10;

//标识符

//如果是标识符中的一个

for(n=0;

9;

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

syn=n+1;

elseif((ch>

IsNum:

k=0;

elseswitch(ch)

case'

<

'

m=0;

syn=35;

syn=34;

p--;

>

syn=33;

syn=32;

temp2=prog[p];

if((p==1)&

(prog[1]>

(prog[1]<

isSignal=2;

gotoIsNum;

if((prog[p-2]>

(prog[p-2]<

{

syn=22;

if((temp2>

(temp2<

syn=11;

{syn=22;

isSignal=1;

elseif((prog[p-2]>

syn=23;

elseif((temp2>

//转到数字的识别

else

syn=24;

syn=21;

syn=31;

('

syn=26;

)'

syn=27;

{'

syn=28;

}'

syn=29;

'

syn=30;

['

syn=38;

]'

syn=39;

case'

syn=0;

p=p-1;

syn=-1;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2