• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

用C语言实现简单的词法分析器

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。


要实现的词法分析器单词符号及种别码对照表:

单词符号 # begin if then while do End + - * / : : =
种别码 0 1 2 3 4 5 6 13 14 15 16 17 18

单词符号 < <> <= > >= = ; ( ) Letter(letter|digit) digit digit*
种别码 20 21 22 23 24 25 26 27 28 10 11


#include<stdio.h>
#include<string.h>
char input[200];//存放输入字符串 
char token[5];//存放构成单词符号的字符串 
char ch;     //存放当前读入字符 
int p;       //input[]下标 
int fg;     //switch标记 
int num;    //存放整形值 

//二维字符数组,存放关键字 
char index[6][6]={"begin","if","then","while","do","end"};
main()
{
 p=0;
 printf("please intput string(End with '#'):\n");
do
{
 ch=getchar();
 input[p++]=ch;
}while(ch!='#');
p=0;
do
{
 scaner();
 switch(fg)
 {
  case 11:printf("( %d,%d )   ",fg,num);break;
  case -1:printf("input error\n");  break;
  default:printf("( %d,%s )   ",fg,token);
 }
}while(fg!=0);
getch(); //用于让程序停留在显示页面
}
/*词法扫描程序:*/
scaner()
{
	int m=0;//token[]下标 
	int n;
	
    //清空token[] 
    for(n=0;n<5;n++)
       token[n]=NULL;
  
    //获取第一个不为0字符 
    ch=input[p++];
    while(ch==' ')ch=input[p++];
  
    //关键字(标识符)处理流程 
    if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))
       {
          while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'))
             {
                 token[m++]=ch;
                 ch=input[p++];
             }
          token[m++]='\0';
          ch=input[--p];
          fg=10;
          for(n=0;n<6;n++)
             if(strcmp(token,index[n])==0)//strcmp()比较两个字符串,相等返回0 
                 {
                    fg=n+1;
                    break;
                 }
       }
       
     //数字处理流程 
     else if((ch<='9'&&ch>='0'))
     {
          num=0;
          while((ch<='9'&&ch>='0'))
          {
           num=num*10+ch-'0';
           ch=input[p++];
          }
           ch=input[--p];
           fg=11;
     }
     
     //运算符界符处理流程 
     else
         switch(ch)
          {
             case '<':
			     m=0;
				 token[m++]=ch;
                 ch=input[p++];
                 if(ch=='>')          //产生<> 
                   {
                      fg=21;
                      token[m++]=ch;
                    }
                 else if(ch=='=')     //产生<= 
                   {
                      fg=22;
                      token[m++]=ch;
                   }
                 else
                   {
                      fg=20;
                      ch=input[--p];
                   }
                 break;
		     case '>':
			     token[m++]=ch;
                 ch=input[p++];
                 if(ch=='=')        //产生>= 
                   {
                      fg=24;
                      token[m++]=ch;
                   }
                 else               //产生> 
                   {
                      fg=23;
                      ch=input[--p];
                   }
                 break; 
			 case ':':
			     token[m++]=ch;
                 ch=input[p++];
                 if(ch=='=')        //产生:= 
                   {
                      fg=18;
                      token[m++]=ch;
                   }
                 else              //产生: 
                   {
                      fg=17;
                      ch=input[--p];
                   }
                 break;
            case '+':fg=13;token[0]=ch;break;
            case '-':fg=14;token[0]=ch;break;
            case '*':fg=15;token[0]=ch;break;
            case '/':fg=16;token[0]=ch;break;
            case ':=':fg=18;token[0]=ch;break;
            case '<>':fg=21;token[0]=ch;break;
            case '<=':fg=22;token[0]=ch;break;
            case '>=':fg=24;token[0]=ch;break;
            case '=':fg=25;token[0]=ch;break;
            case ';':fg=26;token[0]=ch;break;
            case '(':fg=27;token[0]=ch;break;
            case ')':fg=28;token[0]=ch;break;
            case '#':fg=0;token[0]=ch;break;
            default:fg=-1;
        }
}



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
LearnCTheHardWay发布时间:2022-07-14
下一篇:
c语言和设计模式发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap