没有合适的资源?快使用搜索试试~ 我知道了~
编译原理词法分析程序[参考].pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 113 浏览量
2021-10-12
06:01:49
上传
评论
收藏 20KB PDF 举报
温馨提示
试读
13页
编译原理词法分析程序[参考].pdf
资源推荐
资源详情
资源评论
用 C++编写的词法分析程序
//c++ 程序
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define KEYWORD_LEN 32 //保留字个数
#define STR_MAX_LEN 300 //标识符最大长度
#define PRO_MAX_LEN 20480 // 源程序最大长度
#define STB_MAX_LEN 1000 //符号表最大容量
#define CTB_MAX_LEN 1000 // 常数表最大容量
#define ERROR 0 // 错误
#define ID (KEYWORD_LEN+1) //标识符
#define CONST (KEYWORD_LEN+2) // 常量
#define OPERAT (KEYWORD_LEN+3) //运算符
#define DIVIDE (KEYWORD_LEN+4) //界符
int errorLine=0;
char proBuffer[PRO_MAX_LEN] = ""; // 存储程序代码的全局缓冲区
char ch; // 读出来的当前字符
char wordget[STR_MAX_LEN]; // 标识符 或 常量
int point = 0; // 源程序当前位置指针
char signTab[STB_MAX_LEN][STR_MAX_LEN]; //符号表
int pointSTB = 0; //符号表指针
char constTab[CTB_MAX_LEN][STR_MAX_LEN]; //常量表
int pointCTB = 0; // 常数表指针
char kwTab[KEYWORD_LEN][10]={ //保留字表 C 语言一共有 32 个保留字 [关键字 ]
"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"};
char errorTab[][50]={ //错误代码表
/*0*/" 未知错误 ", /*1*/" 非法的字符 ", /*2*/" 不正确的字符常量表达 ",
/*3*/" 不正确的字符串表达 ", /*4*/" 不正确的数字表达 ", /*5*/" 注释丢失 '*/'"};
typedef struct signDuality
{
int kind;
int value;
}*pDualistic, Dualistic;
void pretreatment(); // 预处理
void ProcError(int id); //错误
bool GetChar(); //获得一个字符不包括结束标记
bool GetBC(); // 获得一个非空白字符
void Concat(char *str); //将 ch 连接到 str 后
int Reserve(char *str); // 对 str 字符串查找保留字表 若是一个保留字 -返回其编码 否则返
回
0
void Retract(); // 将搜索指示器回调一个字符位置
int InsertId(char *str);// 将 str 串以标识符插入符号表,并返回符号表指针
int InsertConst(char *str); //将 str 串以常数插入符号表,并返回常数表指针
bool wordAnalyse(pDualistic pDu); // 词法分析 true 正常
//预处理 将缓冲区内的源代码去掉注释和无效空格
void pretreatment()
{int lines=0;
char tmp[PRO_MAX_LEN]; // 先将处理结果保存到临时空间
int tmpp = 0; //这个临时空间的末尾指针
bool flg;
char tmpc;
//去掉注释先
//注释有两种 一种是 // 另一种是 /**/
point = 0;
do
{
flg = GetChar();
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(); //归还一个字符
}while(flg && !(flg && tmpc == '*' && ch == '/'));
flg = GetChar();
if (!flg)
{
ProcError(5);
}
break;
default: //不是任何一种注释
Retract();
Retract();
GetChar();
tmp[tmpp++] = ch;
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]);
}
剩余12页未读,继续阅读
资源评论
czq131452007
- 粉丝: 2
- 资源: 12万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功