亲爱的猪小呢
既然是C语言词法分析器,那就是用C/C++对一段C语言文本进行词法分析,C语言中的for语句、while语句、switch语句、if语句等等的进行分析并将其提取出来的一个设计和实现过程而矣这是大学专门有一门《编译原理》的课程而矣
summer阿超
#include <>#include <>#include <>#include <>#define SPACE 0x20 //空格键#define CHANGE 'c' //转义字符#define STRING 'S' //引号里的字符串#define BOUNDARY 'B' //界符#define OPERATION 'O' //运算符#define WORD 'I' //标识符#define KEY_WORD 'K' //关键字#define DIGIT 'n' //数字,包括小数#define DOTH 'd' //头文件,“.h”文件#define INT 't'#define VOID 'v'#define IF 'f'#define ELSE 'e'#define WHILE 'w'#define FOR 'r'#define MAIN 'm'#define PRINTF 'p'#define INCLUDE 'u'#define FLOAT 'l'#define KEYNUM 10#define BOUNDNUM 8#define OPERNUM 7#define VALUENUM 100/************************************************************************//* data type *//************************************************************************/struct bianliang{ int id; char name[20]; int value;};struct changliang{ int data;};char KeyWord[KEYNUM][8]={"int","void","if","else","while","for","main","printf","include","float"};char Boundary[BOUNDNUM]={'"',';',',','(',')','#','{','}'};char Operation[OPERNUM]={'+','-','*','/','=','<','>'}; char Logogram[KEYNUM]={INT,VOID,IF,ELSE,WHILE,FOR,MAIN,PRINTF,INCLUDE,FLOAT};char Value[VALUENUM][8];int Value_n=0;int ErrorLine=0;int QuotationCount=0; //计算引号的数量int QuotationFlag=0; //引号数量为奇数时为1,偶数时为0char LastOpera=0; //用于判断"=="号存前一个"="号/************************************************************************//* function describe *//************************************************************************/int isKeyWord(char* s) //是关键字返回1,否则返回0{ int i; for (i=0;i
iamYolandaXYZ
时间:2012-10-30 晚要求:输入一串字符串,对其进行词法分析,并且按照(<种别>,<字符串/数字>)格式进行输出种别编码:符号 种别 符号 种别 符号 种别begin 1 + 13 <= 22if 2 - 14 > 23then 3 * 15 >= 24while 4 / 16 = 25do 5 : 17 ; 26end 6 := 18 ( 27l(l|d)* 10 < 20 ) 28数字① 11 <> 21 # 0①数字的词法正规式如下:( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε)ps:输入的字符串以“#”结尾运行环境:VC++说明:搜索网上的资源,大部分的“数字”部分都是dd*形式,但这次试验要求的是①形式,因而在数字部分做了很大努力。与dd*形式的不同有三个地方——ch是数字时,ch是+后接着是数字形式,ch是-后接着是数字形式。然而由于水平有限,时间较短,每个“加号”或“减号”后必须要在输入数字正负符号,否则会默认“+”“-”为正负符号而不是“加号”“减号”。希望能有简单方法解决这个问题。源代码: #include <> //定义I/O库所用的某些宏和变量#include <> //定义字符串库函数#include <> //定义数学运算符号库函数char prog[80],token[8]; //prog:缓冲区;token:一个有意义的字符串char ch; //ch:当前处理的字符int syn,p,m,n,f,e; //syn:类别;p,m,n:计数变量;f,标记数字正负;e,10的次方数double sum; //sum,数字char *rwtab[6]={"begin","if","then","while","do","end"}; //基本字表置初值void main(void) //主函数{ void scaner(void); //声明函数 p=0; printf("\n请输入字符串:\n"); do{ //输入的字符放入缓冲区 ch=getchar(); prog[p++]=ch; }while(ch!='#'); p=0; do{ //分析词法并输出结果 scaner(); switch(syn) { case 11:printf("(%2d,%16g)\n",syn,sum);break; case -1:printf("输入错误\n");break; default:printf("(%2d,%16s)\n",syn,token); } }while(syn!=0);}void scaner(void){ for(n=0;n<8;n++) //token初始化 token[n]=NULL; ch=prog[p++]; while(ch==' ') //如果取消空字符(目前空字符只包括空格) ch=prog[p++]; if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //如果ch是字母字符 { m=0; while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) //如果ch是字母字符或数字字符 { token[m++]=ch; ch=prog[p++]; //读下一个字符 } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; //给出syn值 break; } } else if(ch>='0'&&ch<='9') //数字(1) { sum=0; while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0'; ch=prog[p++]; } if(ch=='.') //有小数点 { e=-1; ch=prog[p++]; if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { sum=sum+(ch-'0')*pow(10,e--); ch=prog[p++]; } } } if(ch=='e'||ch=='E') //有e { e=0,f=1; ch=prog[p++]; if(ch=='+') { f=1; ch=prog[p++]; } else if(ch=='-') { f=-1; ch=prog[p++]; } if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { e=e*10+ch-'0'; ch=prog[p++]; } } e=e*f; sum=sum*pow(10,e); } p--; syn=11; } else switch(ch) { case '<': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='>') //<> { syn=21; token[m++]=ch; } else if(ch=='=') //<= { syn=22; token[m++]=ch; } else //< { syn=20; p--; } break; case '>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') //>= { syn=24; token[m++]=ch; } else //> { syn=23; p--; } break; case ':': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') //:= { syn=18; token[m++]=ch; } else //: { syn=17; p--; } break; case '+': ch=prog[p++]; if(ch>='0'&&ch<='9') //数字(2) { sum=0; while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0'; ch=prog[p++]; } if(ch=='.') //有小数点 { e=-1; ch=prog[p++]; if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { sum=sum+(ch-'0')*pow(10,e--); ch=prog[p++]; } } } if(ch=='e'||ch=='E') //有e { e=0,f=1; ch=prog[p++]; if(ch=='+') { f=1; ch=prog[p++]; } else if(ch=='-') { f=-1; ch=prog[p++]; } if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { e=e*10+ch-'0'; ch=prog[p++]; } } e=e*f; sum=sum*pow(10,e); } p--; syn=11; } else //+ { syn=13; p--; ch=prog[p-1]; token[0]=ch; } break; case '-': ch=prog[p++]; if(ch>='0'&&ch<='9') //数字(3) { sum=0; while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0'; ch=prog[p++]; } if(ch=='.') //有小数点 { e=-1; ch=prog[p++]; if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { sum=sum+(ch-'0')*pow(10,e--); ch=prog[p++]; } } } if(ch=='e'||ch=='E') //有e { e=0,f=1; ch=prog[p++]; if(ch=='+') { f=1; ch=prog[p++]; } else if(ch=='-') { f=-1; ch=prog[p++]; } if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { e=e*10+ch-'0'; ch=prog[p++]; } } e=e*f; sum=sum*pow(10,e); } sum=-sum; p--; syn=11; } else //- { syn=13; p--; ch=prog[p-1]; token[0]=ch; } break; case '*': syn=15;token[0]=ch;break; case '/': syn=16;token[0]=ch;break; case '=': syn=25;token[0]=ch;break; case ';': syn=26;token[0]=ch;break; case '(': syn=27;token[0]=ch;break; case ')': syn=28;token[0]=ch;break; case '#': syn=0;token[0]=ch;break; default: syn=-1; }}试试吧
掌握大量的近义词知识,才能把话说得更加准确严密,把意思表达得更加清楚、明白。常见的近义词辨析可以从下面三方面作手。 NO.1词义辨析 1.语意的轻重不同。有的近
1、题目:题目是论文内容的概括,向读者说明研究的主要问题。一个好的学术论文题目应当是准确概括论文内容,文字简练、新颖,范围明确,便于分类的2、前言:前言又或者序
课题开题报告的研究现状也叫“国内外相关研究现状”,阐述别人在本研究领域或相关课题研究中做了什么,做得如何,有哪些问题解决了,哪些尚未解决,以便为自己开展课题研究
分析论文写作格式是有标准化格式的,包括绪论,文件综述,提出研究假设,论证过程,研究结果,研究不足与反思。
论文中常用的20种研究方法如下: 1、实证研究法 实证研究法是认识客观现象,向人们提供实在、有用、确定、精确的知识研究方法,其重点是研究现象本身“是什么”的问题