词法分析器,C语言写的,很不错

合集下载

C语言词法分析器设计与实现

C语言词法分析器设计与实现

> C语言词法分析器设计与实现C语言词法分析器的设计与实现一.实验目的1.强化对系统软件综合工程实现能力、规划能力的训练;2.加强对词法分析原理、方法和基本实现技术的理解;二.实验内容用C语言(或 C++ )作为宿主语言完成:其中具体要求:1.使用DFA实现词法分析器的设计;2.实现对C源程序中注释的过滤;3.利用两对半缓冲区从文件中逐一读取单词;4.词法分析结果属性字流存放在独立文件中;5.统计源程序每行单词的个数和整个源文件单词个数;6.具有报告词法错误和出错位置(源程序行号和该行字符)的功能;7.屏幕输出属性字流,每次显示10行,按ESC可中途退出,每行有统计信息,最后有词法分析的全部信息,包括各种属性单词的个数。

三.实验验收与评分要求1.编写C语言词法分析器的源程序并调试通过;2.通过测试程序的验收 (测试程序名称:Test-Lexcial);3.提交简明扼要的书面实验报告。

内容包括:FA设计;源程序主要函数功能;主要数据结构设计。

四. 验收测试用例1. 测试用例一:统一验收测试用例;#include<stdio.h>#include<string.h>char buf[100],str[15];int countdef=0;FILE *fpmiddle;struct define{char with[30];char des[30];char filename[15];}def[30];char* getFileName(){int i=0,k=0;for(i=0;buf[i]!='<'&&i<30&&buf[i]!='\0';i++);i++;while(buf[i]!='>'&&i<30&&buf[i]!='\0')str[k++]=buf[i++];str[k]='\0';puts(str);return str;}long readline(FILE *fpt){if(fgets(buf,100,fpt)==NULL){puts(buf);printf("readline error or reach file end!\n");return 0;}puts(buf);return (long)(strlen(buf)+1);}void writeline(){fprintf(fpmiddle,"%s",buf);}void processDefine(char *filename){int i=8,j=0;while((def[countdef].des[i-8]=buf[i])!=' ') i++;def[countdef].des[i-8]='\0';while((def[countdef].with[j]=buf[i])!='\0'){i++;j++;}def[countdef].with[j-1]='\0';strcpy(def[countdef].filename,filename);countdef++;}long comment(FILE *fpt){char prechar=buf[0],ch='*';int i=0,j=0;for(i=0;buf[i]!='\0'&&!(buf[i]=='/'&&buf[i+1]=='*');i++) ;j=i;buf[i]='\0';if(i==strlen(buf)) return 0L;do{prechar=ch;if((ch=fgetc(fpt))==EOF){printf(" in comment, end");exit(0);}i++;}while(!(prechar=='*'&&ch=='/'));return (long)(i-j+1);}isin(char *p){int i=0,j=0,temp=0;while(temp!=strlen(buf)){while(buf[i]!='\0'&&buf[i]!=p[0])i++;temp=i;while(buf[i]==p[j]&&p[j]!='\0'&&buf[i]!='\0'){i++;j++;}if((i-temp)==strlen(p)) return temp;i=temp+1;j=0;}return -1;}void includeAndDefine(FILE *fpt){void add(char*);void replace(char*);while(readline(fpt)){if(isin("#include")>=0)add(getFileName());else if(isin("#define")>=0)processDefine(str);else{fseek(fpt,comment(fpt),1);replace(str);writeline();}}}void add(char *filename){void replace(char*);FILE *fpp;if((fpp=fopen(filename,"r"))==NULL){printf("file %s not found or open error!",filename);exit(0);}fseek(fpp,-readline(fpp),1);if(isin("#include")<0&&isin("#define")<0)while(readline(fpp)){fseek(fpp,comment(fpp),1);replace(filename);writeline();}elseincludeAndDefine(fpp);fclose(fpp);}void replace(char *filename){int i=0,start=0;for(i=0;i<countdef;i++)if(!strcmp(def[i].filename,filename))break;if(i>=countdef||(start=isin(def[i].des))==-1) return;else{int lenOfWith=strlen(def[i].with);int lenOfDes=strlen(def[i].des);if(lenOfDes>=lenOfWith){int k,j;for(k=start; k<start+lenOfWith; k++)buf[k]=def[i].with[k-start];for(j=(start+lenOfWith); j<start+lenOfDes; j++) buf[j]=' ';}else{int offset=lenOfWith-lenOfDes;int k,j;for(k=offset+strlen(buf);k>start;k--)buf[k]=buf[k-offset];for(j=start;j<start+lenOfWith;j++)buf[j]=def[i].with[j-start];}}}2. 自己编写的C语言词法分析器源码。

词法分析及其C语言实现

词法分析及其C语言实现
1 1 词法分析器的功能与输 出 . 词 法分 析器的输 入是 源程序 , 可以看作是特定语言所允
或 E前面的尾 数部 分必须 有数字 , 面的指 数部 分必 须是 后
整数 。如果程 序中出现 了 E 5 -5或 1E . , 法分析 器就应 0 05词
该报错。但是 , 因为词法分析器只是 掌握 了程 序及 其语言的
1 3 词法分析器 的实现模式 .
在编译程序中 , 词法分 析器可 以有两种 实现 模式 : 完全 独立模式和相对独立模式 。编译 程序 采用哪种模 式 实现词
法分析器完全取决 于实现者 的总体考虑 。
1 4 词法出错处理 .
它的主要任务是 逐个地扫 描构成源程序的字符流 , 把它们 翻
杂得多 , 仅仅在 词法分析阶段 是无法获得一个标识符的所有 信息 的。
收 稿 日期 :0 6 1 2 修 回 日期 :0 7 1 2 2 0 一l —2 2 0 —0 — 2
中单词识别的方法是 :) 当前字 符是字母 , 向判断所 1若 则转 要识别的单词是标识符还是关键字 , 并将结果插 入到单词 二
填写在符号表 中; 同时把源程序 改造成 等价的计算机 内部表
示——单词记号 , 以便编译 的后续 阶段使用 。 词法分析器所输 出的 中关键 字表 , 号表 ( %d的符 。其 符 运 算符 和分界符 ) 预先建好 。
译 成有 意义的单 词序列 , 提供给语法分析器。
在词法分析阶段发现 的错误统称为词 法错 误 , 大多 它们
是单词拼写错误 。有些 单词元素 由特定 的规定 也 能发 现错 误 。例如 , C+ +语 言 中 , 在 实型 常量 的指 数 形式 要求 在 e
1 词 法分 析器 的设 计

简单C语言编译器

简单C语言编译器

简单C语言编译器编译器是一种将高级语言转换为机器语言的软件工具。

它是编译原理中的一个重要概念,负责将程序源代码转换成可执行文件。

在这个过程中,编译器会对源代码进行词法分析、语法分析、语义分析和代码优化等操作。

一个简单的C语言编译器包含以下主要组件:1. 词法分析器(Lexer):词法分析器将源代码分割成一个个词素(token),例如关键字、标识符、运算符和常量等。

它可以通过有限自动机(DFA)来实现,也可以使用现有的词法分析工具如Lex。

2. 语法分析器(Parser):语法分析器根据对应的语法规则,将一系列的词素组合成语法树。

它可以通过上下文无关文法(CFG)来实现,例如使用自顶向下的递归下降分析法或自底向上的移入-规约分析法。

3. 语义分析器(Semantic Analyzer):语义分析器对语法树进行语义检查,例如检查变量的声明和使用是否匹配、类型转换是否合法、函数调用是否正确等。

它还可以生成符号表,用于存储程序中的变量、函数和类型等信息。

4. 中间代码生成器(Intermediate Code Generator):中间代码生成器将语法树转换成一种中间表示形式,通常是三地址码、虚拟机指令或者抽象语法树。

该中间表示形式能够方便后续的代码优化和目标代码生成。

5. 代码优化器(Code Optimizer):代码优化器对中间代码进行优化,以提高目标代码的性能。

常见的优化技术包括常量折叠、复写传播、循环展开、函数内联等。

优化器的目标是在不改变程序行为的前提下,尽可能地减少执行时间和存储空间。

6. 目标代码生成器(Code Generator):目标代码生成器将优化后的中间代码转换成机器语言代码。

它可以根据目标平台的特点选择合适的指令集和寻址方式,并生成可以被计算机硬件执行的程序。

7. 符号表管理器(Symbol Table Manager):符号表管理器负责管理程序中的符号表,其中包含了变量、函数和类型等信息。

编译原理----词法分析程序----C语言版

编译原理----词法分析程序----C语言版

编译原理----词法分析程序----C语⾔版#include<stdio.h>#include<string.h>#include<stdlib.h>char KeyWord[20][100]={"begin","end","if","while","var","procedure","else","for","do","int","read","write"};char yunsuanfu[]="+-*/<>%=";char fenjiefu[]=",;(){}:";int main(){char test[]="var a=10;\nvar b,c;\nprocedure p; \n\tbegin\n\t\tc=a+b\n\tend\n";int len_yunsuanfu=strlen(yunsuanfu);int len_fenjiefu=strlen(fenjiefu);puts(test);int length=strlen(test),i,j,k;for(i=0;i<length;i++){if(test[i]==' '||test[i]=='\n'||test[i]=='\t')continue;int tag=0;for(j=0;j<len_fenjiefu;j++){if(fenjiefu [j]==test[i]){printf("分界符\t%c\n",test[i]);tag=1;break;}}if(tag==1)continue;tag=0;for(j=0;j<len_yunsuanfu;j++){if(yunsuanfu[j]==test[i]){printf("运算符\t%c\n",test[i]);tag=1;break;}}if(tag==1)continue;if(test[i]>='0'&&test[i]<='9'){printf("数字\t");while(test[i]>='0'&&test[i]<='9'){printf("%c",test[i]);i++;}printf("\n");continue;}char temp[100];j=0;while(test[i]>='0'&&test[i]<='9'||test[i]>='a'&&test[i]<='z'||test[i]>='A'&&test[i]<='Z'||test[i]=='_') {temp[j++]=test[i];i++;}i--;temp[j++]='\0';tag=0;for(j=0;j<20;j++){if(strcmp(temp,KeyWord[j])==0){tag=1;printf("关键字\t%s\n",temp);break;}}if(tag==0)printf("标识符\t%s\n",temp);}}。

基于LEX的C语言词法分析器

基于LEX的C语言词法分析器

基于LEX的C语言词法分析器下面是一个基于LEX的C语言词法分析器的示例代码:```c#include <stdio.h>%}letter [a-zA-Z]digit [0-9]id {letter}({letter},{digit})*number {digit}+(\.{digit}+)?([eE][+-]?{digit}+)?%%{number} { printf("Number: %s\n", yytext); }{if} { printf("If: %s\n", yytext); }{else} { printf("Else: %s\n", yytext); }{while} { printf("While: %s\n", yytext); }{for} { printf("For: %s\n", yytext); }{id} { printf("Identifier: %s\n", yytext); }[ \t\n]+ // ignore white space. { printf("Unrecognized character: %c\n", yytext[0]); }%%int maiyylex(;return 0;```在上述代码中,首先是一些初始化的定义,定义了一些正则表达式模式,例如`letter`表示字母,`digit`表示数字,`id`表示标识符,`number`表示数字。

然后是各个模式的匹配规则和对应的处理逻辑。

其中,`{number}`表示如果匹配到了数字模式,就打印出该数字;`{if}`、`{else}`、`{while}`、`{for}`和`{id}`分别表示匹配到了if、else、while、for关键字和标识符,就打印出对应的信息;`[ \t\n]+`表示忽略空格和换行符;`.`表示匹配到了其他未定义的字符,就打印出异常信息。

C语言词法分析器和C-语言语法分析器编译原理课程设计

C语言词法分析器和C-语言语法分析器编译原理课程设计

《编译原理课程设计》课程报告题目 C语言词法分析器和C-语言语法分析器学生姓名学生学号指导教师提交报告时间 2019 年 6 月 8 日C语言词法分析器1 实验目的及意义1.熟悉C语言词法2.掌握构造DFA的过程3.掌握利用DFA实现C语言的词法分析器4.理解编译器词法分析的工作原理2 词法特点及正则表达式2.1词法特点2.1.1 保留字AUTO, BREAK , CASE , CHAR , CONST , CONTINUE , DEFAULT , DO , DOUBLE , ELSE,ENUM , EXTERN , FLOAT , FOR , GOTO,IF , INT , LONG , REGISTER , RETURN,SHORT , SIGNED , SIZEOF , STATIC , STRUCT ,SWITCH , TYPEDEF , UNION , UNSIGNED , VOID,VOLATILE , WHILE,2.1.2 符号+ - * / ++ -- += -= *= < <= > >= == != = ; , ( ) [ ] { } /* */ :2.2 正则表达式whitespace = (newline|blank|tab|comment)+digit=0|..|9nat=digit+signedNat=(+|-)?natNUM=signedNat(“.”nat)?letter = a|..|z|A|..|ZID = letter(letter|digit|“_”)+CHAR = 'other+' STRING = “other+”3 Token定义3.2 tokenType类型代码4 DFA设计4.1 注释的DFA设计注释的DFA如下所示,一共分为5个状态,在开始状态1时,如果输入的字符为/, 则进入状态2,此时有可能进入注释状态,如果在状态2时,输入的字符为*,则进入注释状态,状态将转到3,如果在状态3时,输入的字符为*,则有可能结束注释状态,此时状态将转到状态4,如果在状态4时输入的字符为/,则注释状态结束,状态转移到结束状态。

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

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

⽤C语⾔实现简单的词法分析器词法分析器⼜称扫描器。

词法分析是指将我们编写的⽂本代码流解析为⼀个⼀个的记号,分析得到的记号以供后续语法分析使⽤。

词法分析器的⼯作是低级别的分析:将字符或者字符序列转化成记号.。

要实现的词法分析器单词符号及种别码对照表:单词符号#begin if then while do End+-*/:: =种别码0123456131415161718单词符号<<><=>>==;()Letter(letter|digit)digit digit*种别码2021222324252627281011#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;}//运算符界符处理流程elseswitch(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;}}。

词法分析器实验报告

词法分析器实验报告

词法分析器实验报告词法分析器实验报告一、引言词法分析器是编译器中的重要组成部分,它负责将源代码分解成一个个的词法单元,为之后的语法分析提供基础。

本实验旨在设计和实现一个简单的词法分析器,以深入理解其工作原理和实现过程。

二、实验目标本实验的目标是设计和实现一个能够对C语言代码进行词法分析的程序。

该程序能够将源代码分解成关键字、标识符、常量、运算符等各种词法单元,并输出其对应的词法类别。

三、实验方法1. 设计词法规则:根据C语言的词法规则,设计相应的正则表达式来描述各种词法单元的模式。

2. 实现词法分析器:利用编程语言(如Python)实现词法分析器,将源代码作为输入,根据词法规则将其分解成各种词法单元,并输出其类别。

3. 测试和调试:编写测试用例,对词法分析器进行测试和调试,确保其能够正确地识别和输出各种词法单元。

四、实验过程1. 设计词法规则:根据C语言的词法规则,我们需要设计正则表达式来描述各种词法单元的模式。

例如,关键字可以使用'|'操作符将所有关键字列举出来,标识符可以使用[a-zA-Z_][a-zA-Z0-9_]*的模式来匹配,常量可以使用[0-9]+的模式来匹配等等。

2. 实现词法分析器:我们选择使用Python来实现词法分析器。

首先,我们需要读取源代码文件,并将其按行分解。

然后,针对每一行的代码,我们使用正则表达式进行匹配,以识别各种词法单元。

最后,我们将识别出的词法单元输出到一个结果文件中。

3. 测试和调试:我们编写了一系列的测试用例,包括各种不同的C语言代码片段,以测试词法分析器的正确性和鲁棒性。

通过逐个测试用例的运行结果,我们可以发现和解决词法分析器中的问题,并进行相应的调试。

五、实验结果经过多次测试和调试,我们的词法分析器能够正确地将C语言代码分解成各种词法单元,并输出其对应的类别。

例如,对于输入的代码片段:```cint main() {int a = 10;printf("Hello, world!\n");return 0;}```我们的词法分析器将输出以下结果:```关键字:int标识符:main运算符:(运算符:)运算符:{关键字:int标识符:a运算符:=常量:10运算符:;标识符:printf运算符:(常量:"Hello, world!\n"运算符:)运算符:;关键字:return常量:0运算符:;```可以看到,词法分析器能够正确地将代码分解成各种词法单元,并输出其对应的类别。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我自己写的个词法分析程序可以完成一个非常非常基本的C语言词法分析.自己鼓励下自己 :-)#include <iostream>#include <vector>#include <utility>#include <string>#include <fstream>#include <algorithm>#include <cstdlib>using namespace std;//用来存储目标文件名string file_name;//提取文本文件中的信息。

string GetText();//获得一个单词符号,从位置i开始查找。

//并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。

string GetWord(string str,int i,int& j);//这个函数用来除去字符串中连续的空格和换行//第一个参数为目标字符串,第二个参数为开始位置//返回值为连续的空格和换行后的第一个有效字符在字符串的位置int DeleteNull(string str,int i);//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假bool IsBoundary(string str,int i);//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假bool IsOperation(string str,int i);//此函数将一个pair数组输出到一个文件中void OutFile(vector<pair<int,string> > v);//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组vector<pair<int,string> > analyst(vector<string> vec);//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假bool IsKey(string str);int main(){cout<<"###########################\n";cout<<"###copyright: Giftedbird###\n";cout<<"###########################\n";string com1=" ";string com2="\n";string fileline=GetText();int begin=0,end=0;vector<string> array;do{begin=DeleteNull(fileline,begin);string nowString;nowString=GetWord(fileline,begin,end);if(end==-1)break;if(pare(com1)&&pare(com2))array.push_back(nowString);begin=end+1;}while(true);vector<pair<int,string> > mid_result;mid_result=analyst(array);OutFile(mid_result);cout<<"**********************************************************************\n ";cout<<"***程序已完成词法分析,分析结果已经存储在文件"<<file_name<<"中!!!***\n";cout<<"**********************************************************************\n ";system("pause");return 0;}//提取文本文件中的信息string GetText(){string file_name1;cout<<"请输入源文件名(包括路径和后缀名):";cin>>file_name1;ifstream infile(file_name1.c_str(),ios::in);if (!infile){cerr<<"哦!无法打开文件 "<<file_name1.c_str()<<" !!!"<<endl;exit(-1);}cout<<endl;char f[1000];infile.getline(f,1000,EOF);infile.close();return f;}//获得一个单词符号,从位置i开始查找。

//并且有一个引用参数j,用来返回这个单词最后一个字符在原字符串的位置。

string GetWord(string str,int i,int& j){string no_use("(){} , ; \n+=*/-<>\"");j=str.find_first_of(no_use,i);if(j==-1)return "";if(i!=j)j--;return str.substr(i,j-i+1);}//这个函数用来除去字符串中连续的空格和换行//第一个参数为目标字符串,第二个参数为开始位置//返回值为连续的空格和换行后的第一个有效字符在字符串的位置int DeleteNull(string str,int i){for(;;i++)if(str[i]!=' '&&str[i]!='\n')return i;}//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假bool IsBoundary(string str,int i){int t;char arr[7]={',',';','{','}','(',')','\"'};for (t=0;t<7;t++)if(str[i]==arr[t])return true;return false;}//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假bool IsOperation(string str,int i){int t;char arr[7]={'+','-','*','/','=','<','>'};for (t=0;t<7;t++)if(str[i]==arr[t])return true;return false;}//此函数将一个个字符串数组输出到一个文件中void OutFile(vector<pair<int,string> > v){cout<<"请输入目标文件名(包括路径和后缀名):";cin>>file_name;ofstream outfile(file_name.c_str(),ios::out);if (!outfile){cerr<<"哦!无法打开文件 "<<file_name.c_str()<<" !!!"<<endl;exit(-1);}cout<<endl;int i;outfile<<"###########################\n";outfile<<"###copyright: Giftedbird###\n";outfile<<"###########################\n\n";for(i=0;i<v.size();i++)outfile<<"<"<<v[i].first<<" , \""<<v[i].second<<"\">"<<endl; outfile<<"\n\n*********************************\n";outfile.close();return;}//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组vector<pair<int,string> > analyst(vector<string> vec){vector<pair<int,string> > temp;int i;for(i=0;i<vec.size();i++){if(vec[i].size()==1){if((vec[i]==">"||vec[i]=="<"||vec[i]=="!")&&vec[i+1]=="="){string jk=vec[i];jk.append(vec[++i],0,1);pair<int,string> pp(4,jk);temp.push_back(pp);continue;}if((vec[i]=="+"&&vec[i+1]=="+")||(vec[i]=="-"&&vec[i+1]=="-")) {string jk=vec[i];jk.append(vec[++i],0,1);pair<int,string> pp(4,jk);temp.push_back(pp);continue;}if(IsBoundary(vec[i],0)){pair<int,string> pp(5,vec[i]);temp.push_back(pp);}else if(IsOperation(vec[i],0)){pair<int,string> pp(4,vec[i]);temp.push_back(pp);}else if(vec[i][0]<='9'&&vec[i][0]>='0'){pair<int,string> pp(3,vec[i]);temp.push_back(pp);}else{pair<int,string> pp(2,vec[i]);temp.push_back(pp);}}else if(vec[i][0]<='9'&&vec[i][0]>='0'){pair<int,string> pp(3,vec[i]);temp.push_back(pp);}else if(IsKey(vec[i])){pair<int,string> pp(1,vec[i]);temp.push_back(pp);}else{pair<int,string> pp(2,vec[i]);temp.push_back(pp);}}return temp;}//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假bool IsKey(string str){stringp[16]={"char","double","int","long","double","float","for","while","do","break" ,"continue","switch","short","case","return","if"};vector<string> ppp(p,p+16);int u;for(u=0;u<ppp.size();u++)if(!pare(ppp[u]))return true;return false;}//finished。

相关文档
最新文档