编译原理词法分析器代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define PRO_MAX_LEN 20480 //源程序最大长度
#define STB_MAX_LEN 1000 //符号表最大容量
#define CTB_MAX_LEN 1000 //常数表最大容量
#define ERROR 0 //错误
#define ID (KEYWORD_LEN+1) //标识符
"const", "continue", "default",
"do", "double", "else", "enum",
"extern", "float", "for", "goto",
"if", "int", "long", "register",
"return", "short", "signed", "sizeof",
flg = GetChar();
tmp[tmpp++] = ch;
}
}
else
{
tmp[tmpp++] = ch;
}
}while(flg);
tmp[tmpp] = '\0';
strcpy(proBuffer,tmp);
}
//错误
void ProcError(int id)
{
printf("\nError:第%d行,%s\n",errorLine, errorTab[id]);
void pretreatment()
{
int lines=0;
char tmp[PRO_MAX_LEN]; //先将处理结果保存到临时空间
int tmpp = 0; //这个临时空间的末尾指针
bool flg;
char tmpc; //去掉注释先//注释有两种一种是//另一种是/**/
point = 0;
}
//获得一个字符
bool GetChar()
{
if(point < PRO_MAX_LEN && proBuffer[point] != '\0')
char ch; //读出来的当前字符
char wordget[STR_MAX_LEN]; //标识符或常量
int point = 0; //源程序当前位置指针
char signTab[STB_MAX_LEN][STR_MAX_LEN]; //符号表
int pointSTB = 0; //符号表指针
#define CONST (KEYWORD_LEN+2) //常量
#define OPERAT (KEYWORD_LEN+3) //运算符
#define DIVIDE (KEYWORD_LEN+4) //界符
int errorLine=0; char proBuffer[PRO_MAX_LEN] = ""; //存储程序代码的全局缓冲区
/*3*/"不正确的字符串表达", /*4*/"不正确的数字表达", /*5*/"注释丢失'*/'"};
typedef struct signDuality
{
int kind;
int value;
}*pDualistic, Dualistic;
void pretreatment(); //预处理
void ProcError(int id); //错误
int InsertId(char *str);//将str串以标识符插入符号表,并返回符号表指针
int InsertConst(char *str); //将str串以常数插入符号表,并返回常数表指针
bool wordAnalyse(pDualistic pDu); //词法分析true正常
//预处理将缓冲区内的源代码去掉注释和无效空格
char constTab[CTB_MAX_LEN][STR_MAX_LEN]; //常量表
int pointCTB = 0; //常数表指针
char kwTab[KEYWORD_LEN][10]={ //保留字表C语言一共有32个保留字[关键字]
"auto", "break", "case", "char",
}while(flg && !(flg && tmpc == '*' && ch == '/'));
flg = GetChar();
if (!flg)
{
ProcError(5);
}
break;
default: //不是任何一种注释
Retract();
Retract();
GetChar();
tmp[tmpp++] = ch;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#define KEYWORD_LEN 32 //保留字个数
#define STR_MAX_LEN 300 //标识符最大长度
do
{
flg = ห้องสมุดไป่ตู้etChar();
if(ch == '/')
{
flg = GetChar();
switch(ch)
{
case '/':
do
{
flg = GetChar();
}while(!(ch == '\n' || flg == false));//注释一直到行尾或文件结束
if(ch == '\n')
Retract(); //归还换行
break;
case '*':
do
{
flg = GetChar();
tmpc = ch;
//为了保证出错处理程序能正确定位出错位置保留注释中的换行
if(tmpc == '\n')
tmp[tmpp++] = tmpc;
flg = GetChar();
Retract(); //归还一个字符
bool GetChar(); //获得一个字符不包括结束标记
bool GetBC(); //获得一个非空白字符
void Concat(char *str); //将ch连接到str后
int Reserve(char *str); //对str字符串查找保留字表若是一个保留字-返回其编码否则返回0
void Retract(); //将搜索指示器回调一个字符位置
"static", "struct", "switch", "typedef",
"union", "unsigned", "void", "volatile", "while"};
char errorTab[][50]={ //错误代码表
/*0*/"未知错误", /*1*/"非法的字符", /*2*/"不正确的字符常量表达",
相关文档
最新文档