词法分析器

  • B7_254074
    了解作者
  • 30.9KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-26 05:50
    上传日期
这是一个用c++编写的词法分析器,一个完整的C语言词法分析器。输入一段源程序,能够正确输出单词符号。
cifa.zip
  • 词法分析器
  • 词法分析器.docx
    28.1KB
  • Lexical
  • Lexical.plg
    1.2KB
  • lexical.dsp
    3.3KB
  • lexical.opt
    47.5KB
  • Debug
  • Lexical.ncb
    49KB
  • lexical.cpp
    3.7KB
  • lexical.dsw
    539B
内容介绍
#include <stdio.h> #include <string.h> #include <math.h> char *KeyWord[14]={"for","while","do","if","int","char","long","else","case","enum","break","bool","continue","return"}; void trans(char input[], int c); int main() { char input[100]; int c=0; int syn[20]={0}; int state=0; printf("Please input a string:\n"); //输入程序 do { input[c++]=getchar(); } while(input[c-1]!='$'); //输入$结束 trans(input,c); return 0; } //将输入的字符串转换 void trans(char input[],int c) { int p=0; while(p<c){ char token[10]; char ch; int m=0; int state=0; int isNegative=0; int isDecimal=0; int count=0; double sum; double dTemp; double decimal; int isExp; int index; char cTemp; for(int i=0;i<10;i++) token[i]=NULL; ch=input[p++]; while(ch==' ') //跳过null ch=input[p++]; if(ch=='\0') state=-2; if(ch=='_'||((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))) //ch是字母字符 { while(ch=='_'||((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')&&(ch<='9'))) { token[m++]=ch; //ch=>token ch=input[p++]; //读下一个字符 } token[m++]='\0'; p--; //回退一格 state=1; //标识符 for(i=0;i<14;i++) if(strcmp(token,KeyWord[i])==0) { state=2; //关键字 } printf("(%2d,%s)\n",state,token); } else if((ch>='0')&&(ch<='9')) { while((ch>='0')&&(ch<='9')) { sum=sum*10+ch-'0'; //ch中数字本身是当做字符存放的 token[m++]=ch; ch=input[p++]; } if(ch=='.') { isDecimal=1; token[m++]=ch; ch=input[p++]; count=0; while((ch>='0')&&(ch<='9')) { //pow(x,y)计算x的y次幂 dTemp=(ch-'0')*pow(0.1,++count); decimal=decimal+dTemp; token[m++]=ch; ch=input[p++]; } sum=sum+decimal; } if(ch=='e'||ch=='E') { isExp=1; token[m++]=ch; ch=input[p++]; if(ch=='-') { isNegative=1; token[m++]=ch; ch=input[p++]; } while((ch>='0')&&(ch<='9')) { //指数 index=index*10+ch-'0'; token[m++]=ch; ch=input[p++]; } if(isNegative) sum=sum*pow(0.1,index); else sum=sum*pow(10,index); } p--; state=3;//数字 printf("(%d,%s)\n",state,token); } else switch(ch) { case '<': token[m++]=ch; ch=input[p++]; if(ch=='=') { state=4;//<= token[m++]=ch; } else { state=5;//< p--; } printf("(%d,%s)\n",state,token); break; case '>': token[m++]=ch; ch=input[p++]; if(ch=='=') { state=6;//>= token[m++]=ch; } else { state=7;//> p--; } printf("(%d,%s)\n",state,token); break; case '+': token[m++]=ch; cTemp=input[p]; if(cTemp!='+') { state=8;//+ } if(cTemp=='+') { token[m++]=cTemp; state=9;//++ p++; } printf("(%d,%s)\n",state,token); break; case '-': token[m++]=ch; cTemp=input[p]; if(cTemp!='-') { state=10;//- } if(cTemp=='-') { token[m++]=cTemp; state=11;//-- p++; } printf("(%d,%s)\n",state,token); break; case '*': token[m]=ch; state=12;//* printf("(%d,%s)\n",state,token); break; case '/': token[m]=ch; state=13;//'/' printf("(%d,%s)\n",state,token); break; case '=': state=14;//= token[m++]=ch; printf("(%d,%s)\n",state,token); break; case ';': state=15;//; token[m++]=ch; printf("(%d,%s)\n",state,token); break; case '(': token[m++]=ch; state=16;//( printf("(%d,%s)\n",state,token); break; case ')': token[m++]=ch; state=17;//) printf("(%d,%s)\n",state,token); break; default: printf("error!"); } } }
评论
    相关推荐