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