1、10) isNegative整数,是否为负数幂。isNegative为1,则为负数幂,如123E-2。11) scanner()扫描子程序。12) getchar()从控制台读取一个字符数据。13) double pow(double x,double y),计算x的y次幂。14) int strcmp(char *str1,char #str2),字符串比较。三 流程框图 主程序 扫描子程序四 函数相关说明1. 接收用户输入:getchar()和dowhile循环的组合 do ch=getchar(); progp+=ch; while(ch!=#); /输入以号键结束2. 输出到控制台:d
2、owhile循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。 scanner(); /扫描,单词 switch(syn) case 11: 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; else if(isDecimal=1)(%2d,%8.4f)n else break; case -1:printf(UNKNOWN ERRORnbreak; case 90:%8s小数格
3、式不正确n,token); case 91:%s指数格式不正确n case 99:/syn=99时即判断为注释 default:(%2d,%8s)n,syn,token); while(syn!=0);3. 浮点数的识别,先识别数字,再识别 . ,再识别数字,再识别E或e,再识别 - ,再识别数字。else if(ch0)&(ch sum=sum*10+ch-; /ch中数字本身是当做字符存放的 tokenk+=ch; ch=progp+; if(ch=.) isDecimal=1; if(!(chch /pow(x,y)计算x的y次幂 temp=(ch-)*pow(0.1,+count);
4、decimal=decimal+temp; /AddToDec(); tokenk+=ch; ch=progp+; sum=sum+decimal; if(ch=e)|(ch=E)&(syn!=90) isExp=1; if(ch!)tokenk+=ch; if(ch=- isNegative=1; ch=progp+; 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(isNeg
5、ative) 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(progp-1=)p=p-1; 4. 注释的识别与过滤,识别到/符号的时候进行判断,如若紧跟*符号则判断为注释,p指针不断后移知道读取到*/为止case /: if(progp!* syn=25; tokenm+=ch; do p+; while(!(progp=(progp+1=); p=p+2; ch=progp; syn=99; b
6、reak;五 输入与输出词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。(字符串以“#”号结束)输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。六 程序运行截图七 词法分析器使用说明用户输入待识别字符串(并以“#”结尾,表示字符串输入结束),回车后程序自动输出词法分析结果。八 心得与体会词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。九 源程序清单#
7、includestring.hmath.hiostreamchar prog180; /存放所有输入字符char token20; /存放词组char ch; /单个字符int syn,p,m,n;/syn:种别编码double sum; int count;int isSignal; /是否带正负号(0不带,1负号,2正号)int isDecimal; /是否是小数 double decimal; /小数int isExp=0; /是否是指数int index; /指数幂int isNegative; /是否带负号double temp;int temp2;int k;void scanne
8、r();char *rwtab9=mainintfloatdoublecharelsevoid main() p=0; count=0; isDecimal=0; index=0; printf(n Please input string:n system(pausevoid scanner() sum=0; decimal=0; m=0; for(n=0;naz)|(chAZ) /ch是字母字符 while(ch) tokenm+=ch; /ch=token /读下一个字符 tokenm+=0 p-; /回退一格 syn=10; /标识符 /如果是标识符中的一个 for(n=0;9; if(strcmp(token,rwtabn)=0) syn=n+1; else if(chIsNum: k=0; else switch(ch) case syn=33; syn=32; temp2=progp; if(p=1)&(prog1(prog1(progp-2(temp2 syn=23; else if(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