词法分析器、语法分析器、语义分析器 的区别以及别人编写的程序。

顾名思义,词法分析器检查的是词法,语法分析器分析的是语法,什么是词法,什么是语法你弄明白就知道了。
所谓词法,源代码由字符流组成,字符流中包括关键字,变量名,方法名,括号等等符号,其中变量名要满足不能包括标点符号,不能以数字开头的数字与字母的字符串这个条件,对于括号要成对出现等等,这就是词法;
而语法,词法没有问题才能进入语法分析,语法就是词排列的方法,字面意义,比如一句中文:我吃萝卜,里面有三个词我 吃 萝卜,除了“我吃萝卜”外,这三个词还可以组成,“萝卜吃我”“萝卜我吃”等,显然按照中文文法,后面的两句话是不对的,语法分析器就是分析类似这样的语法的。




高分求用C语言编写的词法分析、语法分析及语义分析器,要求是有界面的那种,可发到我邮箱84369651@qq.com

举报|2010-12-09 20:52 传说中的小U  |  分类:C/C++  |  浏览1634次
请知道的高手帮帮忙~
2010-12-09 21:09 提问者采纳
以前写的 看对你有帮助没

#include"stdio.h"
#include"conio.h"
#include"string.h"
#include"stdlib.h"
#define num 10
#define num0 9
#define num1 9
char *KeyWords[num]=
{"int","float","char","while","if","else","switch","case","break","return" };//关键字 
char ope[num0]={'+','-','*','/','|','&','=','>','<'};//操作符 
char edgesign[num1]={';',',','(',')','"','{','}'};//分隔符 不含 换行,空格 
int Key(char *word)
{ for(int i=0;i< num;i++)
      if(!strcmp(KeyWords[i],word))
       return 1;
    return 0;
}//确定是否为关键字 
int yun(char word)
{ 
for(int i=0;i<num0;i++)
     if(ope[i]==word)
         return 1;
    return 0;
}//确定是否为运算符 
int Sign(char word)
{   for(int i=0;i<num1;i++)
     if(edgesign[i]==word)
      return 1;
    return 0;
}//确定 是否为分隔符符 

void out2(char word)    //4为运算符,5为分隔符 
 {
       if(yun(word))
        {
        printf("(4,\"%c\")\n",word);
             } 
          if(Sign(word))
           {  printf("(5,\"%c\")\n",word);
            }      
               
}
void out1(char *word,int Len) //3为字符或者数字,2为标识符,1为关键字 
 {     int a;
       if(Key(word))
       printf("(1,\"%s\")\n",word);
       else { 
               if( word[0]=='\'' && word[Len-1]=='\'')             //字符常量 
               printf("(3,\"%s\")\n",word);
               else     if((a=atoi(word)))//字符串转化为数字 
             printf("(3,\"%d\")\n",a);   
           else  {  
                 if(word[0]!='\0') printf("(2,\"%s\")\n",word);
                 }
         }     
     
 }

int Scan()
{   FILE *fp;
   char temp[10],ch='1',temp1;
   char filename[20];
   int i,j;
     printf("请输入文件名");
     scanf("%s",filename);
     if((fp=fopen(filename,"r"))==NULL) 
         {
          printf("文件打开失败");
            return 0
   
   ; }
            
            while(ch!=EOF){
                           j=0;  
                           i=0;
                           ch=fgetc(fp);
               while(!Sign(ch)&&!yun(ch)&&ch!=' '&&ch!='\n'&&ch!=EOF)
                {                 temp[i]=ch;
                                  temp[i+1]='\0';
                                  ch=fgetc(fp);             
                                i++; 
                   }  
                    out1(temp,i);
                    temp[0]='\0';//清除字串 
                      temp1=ch;                 
                   out2(temp1);
                   temp1='\0';//清除字符 
                    } 
              
fclose(fp);
return 1;
}

int main()
{
  Scan();
  getchar();
  getchar();  
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值