首页 > 编程知识 正文

维生素c与分析方法的关系有,编程语言分析

时间:2023-05-04 20:42:06 阅读:110099 作者:925

在阅读语法分析器设计(c实现)之前,请务必查看。 这个语法分析器的设计。

文章目录句法分析器的设计(c实现)步骤代码执行截图

以步骤Visual C为实验开发环境,创建win32控制台应用程序项目。 (1)存储结构定义:以ParserDef.h和LexerDef.h为文件名;

)2)基本操作的算法定义(以ParserAlgo.h和LexerAlgo.h为文件名;

)3)调用基本操作的主程序:以ParserMain.cpp为文件名。

编写程序:

)1)文件LexerDef.h和LexerAlgo.h是实验1的内容。

)2)文件ParserDef.h定义句法分析所需的全局变量等。

)3)文档ParserAlgo.h实现对语法规则中各语法成分的分析子算法。

)4)文件ParserMain.cpp实现了对本实验简单语言语法规则的递归下降句法分析器。

代码//parser def.h//anhighlightedblock # include ' stdio.h ' # include ' string.h ' char Prog [ 100 ],token[8] char //prog[100]存储要处理的对象,token将char *rwtab[6]={'begin ',' if ',' then ',' while ',ch与关键字进行比较输入标志; //flag与是否为end的判断有关//parser algo.h//anhighlightedblock # include ' parse def.h ' void factor (void ); //factorvoidexpression(void ); //表达式expressionvoidYucu(void ); voidterm(void; //项termvoidstatement(void ); //语句statementvoidparser(void; void扫描程序(void; //扫描仪//*调用各种递归子程序以完成语法分析的过程//voidparser(void ) (if ) syn==1)/begin (scaner ); /*下一个单词符号*/yucu (阅读; yucu (调用函数; */if(syn==6)/end (scaner ); if () syn==0) (flag==0) ) /出现#且flag=0printf(success! n '; (else ) if )标志!=1)打印(the string haven ' t gota ' end '! n '; 用//flag判断endflag=1) }else{printf('Haven'tgota'Begin '! n '; flag=1; } return; }voidYucu(void ) {statement; /*调用函数statement (; */while(syn==26 ) /分号) {scaner; /*下一个单词符号*/if(syn!=6)状态); /*调用函数statement (; ()返回; }voidstatement(void ) if ) syn==10 ) {scaner; /*下一个单词符号*/if(syn==18 ) {scaner; /*下一个单词符号*/expression (阅读; /*函数expression (调用; (/) else ) printf('thesing':='isWrong! n '; flag=1; }else{printf('wrongsentence! n '; flag=1; } return; }voidexpression(void ) {term; while((syn==13 )|) syn==14 ) ) { scaner; /*下一个单词符号*/term (阅读; /*调用函数term (; ()返回; }voidterm(void ) {factor; while((syn==15 )|) syn==16 ) ) { scaner; /*阅读下一个单词符号*/factor (); /*函数调用函数(; ()返回; }voidfactor(void )//因式处理函数(if ) ) (syn==10 )syn==11 ) ) /标识符,数字) {scaner; }elseif(syn==27 ) /以左括号开头) ({ scaner; /*下一个单词符号*/expression (阅读; /*调用函数statement (; (/if ) syn==28 ) /出现大括号) {scaner; /*阅读下一个单词符号*/} else { p

rintf("the error on '('n"); flag=1; } } else{printf("the expression error!n"); flag=1; } return;} /*主要完成赋值种别码等词法分析功能*/void scaner(void)//扫描器,词法分析器内容{sum=0;//数字初始化为0 for(m=0;m<8;m++)//初始化tokentoken[m++]=NULL; m=0;//m为token的指针ch=prog[p++];//数组指针+1 while(ch==' ')//遇到空格+1ch=prog[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))//遇到字母{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))){token[m++]=ch;ch=prog[p++];//p+1,下次循环使用}p--;//循环跳出,要-1syn=10;//10,字母开头token[m++]='';//为字符串结束符 /*判别是否为关键字*/for(n=0;n<6;n++)//n为rwtab的指针if(strcmp(token,rwtab[n])==0)//strcmp返回值为0,则两个参数大小相同{syn=n+1;break;}} else if((ch>='0')&&(ch<='9'))//遇到数字{while((ch>='0')&&(ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}p--;//回溯syn=11;//11为数字} /*除数字和字母开头以外的其他符号*/elseswitch(ch){case '<':m=0;ch=prog[p++];if(ch=='>'){syn=21;}else if(ch=='='){syn=22;}else{syn=20;p--;//回溯}break; case '>':m=0;ch=prog[p++];if(ch=='='){syn=24;}else{syn=23;p--;}break; case ':':m=0;ch=prog[p++];if(ch=='='){syn=18;}else{syn=17;p--;}break; case '+':syn=13;break; case '-':syn=14;break; case '*':syn=15;break; case '/':syn=16;break; case '(':syn=27;break; case ')':syn=28;break; case '=':syn=25;break; case ';':syn=26;break; case '#':syn=0;break; default:syn=-1;break;}} // ParserMain.cpp // An highlighted block/*待分析的简单语言的语法用扩充的BNF表示如下:⑴<程序>::=begin<语句串>end⑵<语句串>::=<语句>{;<语句>}⑶<语句>::=<赋值语句>⑷<赋值语句>::=ID:=<表达式>⑸<表达式>::=<项>{+<项> | -<项>}⑹<项>::=<因子>{*<因子> | /<因子>⑺<因子>::=ID | NUM | (<表达式>)*/ #include "stdio.h"#include "string.h"#include "ParseAlgo.h" int main(void){p=flag=0;printf("nplease input a string (end with '#'): n"); /*从命令行读取要处理的对象,并存储在prog[]数组中*/do{scanf("%c",&ch);//printf("n input %c nown",ch);prog[p++]=ch;}while(ch!='#'); p=0;scaner();//主要完成赋值种别码等词法分析功能parser();//调用各种递归子程序,完成语法分析的过程//getch();} 运行截图

(1)源程序begin a:=9; x:=2*3; b:=a+x end #

(2)源程序x:=a+b*c end #

(3)输入一段此简单语言的源程序,输入的简单语言字符串:

好了,到这里已经结束了,这是词法分析器的实现,有想了解详细过程和原理的可以留言或私信我。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。