首页 > 编程知识 正文

c语言词法分析器的简单实现,编译原理简单计算器的编写

时间:2023-05-03 19:18:22 阅读:156383 作者:1134

此次内容主要是用C语言实现简单的词法分析器,理论知识较少,在获得编译原理的基础知识后,提供代码学习。

使用语言: c语言

编译环境: vs代码

什么是词法分析器设计词法分析器c语言代码实现编译原理总框架:

一、词法分析器词法分析(lexical analysis )是指计算机科学将字符串转换为单词Token )列的过程。 进行词法分析的程序或函数称为词法分析器(Lexical analyzer,简称Lexer ),也称为扫描仪。 词法分析器一般作为函数存在,由语法分析器调用。

一般理解:我们可以联想到英语句子。 如果给我们一串英语句子的话,这个时候我们必须提取所有的单词。 词法分析器的作用。 句法分析器调用词法分析器,实现各单词的解释翻译。

二、设计词法分析器概要:主要是数字、字符串(标识符和关键字)、运算符、边界符号等。 从数字开始,一个一个识别,用asc码将文字转换成数字提取; 由于关键字的枚举存储有限,所以通过判断字符串完全匹配来确定,如果字符串不是关键字,则为标识符。其他特殊符号是直接代码提取,基于有限的特性。

对照表如下。

三、C语言代码的实现在大家理解词法分析器后,结合代码学习效果更好。

C语言代码如下。

# include stdio.h # include string.hcharinput [ 200 ]; //输入字符串char token[5]; //包含构成单词符号的字符串char ch; //存储当前已读取的字符int p//input [ ]下标int fg; //switch标记int num; //整数值//存储二维字符数组,关键字char index[6][6]={'begin ',' if ',' then ',' while ',' do ',' end'}; //词法分析方法是声明void scaner (); int main () p=0; printf (pleaseintputstring (end with ' # ' ) :(n ' ); //循环读取字符do { ch=getchar (; input[p ]=ch; }while(ch!='# '; p=0; do { scaner (; switch(fg ) ) case8:printf () ) ) d,)、fg、num ); 黑; case-1:打印(输入错误(n ) ); 黑; default:printf () (%d,%s )、fg、token ); }while(fg!=0; 返回0; (/)词法分析(*/void scaner ) ) ) {int m=0; //token[]下标int n; //空格ch=input[p ]; wile(ch==' ' ) ch=input[p ]; //关键字(标识符)处理流程if((ch='z'ch='a ' )|(ch=' z ' ch=' a ' ) ) (while ) ) ch=' z ' ch=' a '|) (p----; token[m ]=' '; fg=7; for(n=0; n6; n () if )//strcmp ) Token,index[n]==0)//strcmp )比较两个字符串,并返回相等的0 ) fg=n1; 黑; }//数字处理过程elseif () ch='9'ch='0' ) ) { num=0; while () ch='9'ch='0' ) { num=num*10 ch-'0); ch=input[p ]; (p----; fg=8; //运算符边界元处理流程elseswitch(ch ) ) case'': ) token[m]=ch; ch=input[p ]; if(ch==' ' ) /发生) { fg=14; token[m ]=ch; (elseif ) ch=='=' ) ) /发生=)={ fg=15; token[m ]=ch; (else ) fg=13; p----; } token[m ]=' '; 黑; } case '': { token[m ]=ch; ch=input[p ]; if(ch=='=' ) ) /发生={ fg=17; token[m ]=ch; (} else //发生) { fg=16; p----; } token[m ]=' '; 黑; } case ' ': fg=9; token[0]=ch; token[1]=' '; 黑; case '-': fg=10; token[0]=ch; token[1]=' '; 黑; case '*': fg=11; token[0]=ch; token[1]=' '; 黑; case '/': fg=12; token[0]=ch; token[1]=' '; 黑; case '=': fg=18; token[0]=ch; token[1]=' '; 黑; case’; ' : fg=19; token[0]=ch; token[1]=' '; 黑; case'(:fg=20; token[0]=ch; token[1]=' '; 黑; case ' ) ' : fg=21; token[0]=ch; token[1]=' '; 黑; case '#': fg=0; token[0]=ch; token[1]=' '; 黑; default: fg=-1; (四)运行结果

这次的内容到此结束。 大家如果有建议和疑问,可以在下面的评论区讨论,互相交流学习进步。

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