资源简介
编译原理-递归下降语法分析器源代码,手写有注释,能打印出语法树,进行部分错误处理,dev c编写,所有内容皆由一个cpp文件实现
代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std;
#define BUFLEN 256
#define MAXLEN 256
#define MAXTOKENLEN 40
#define MAXCHILDREN 4
static int lineno;
static int linepos = 0;
static int EOF_FLAG = false;
static int bufsize = 0;
static char lineBuf[BUFLEN];
FILE * source;
char tokenString[41];
string output;//输出文件
enum TokenType
{
ENDFILE ERROR
IF ELSE INT RETURN VOID WHILE
ID NUM
EQ ASSIGN LT GT PLUS MINUS TIMES OVER LPAREN RPAREN SEMI LBRACKET RBRACKET LBRACE RBRACE COMMA
GEQ NEQ LEQ
};
enum StateType
{
START INASSIGN INCOMMENT INNUM INID DONE PRECOMMENT AFTERCOMMENT
};
struct
{
char* str;
TokenType tok;
}ReserverWords[6]=
{ {“if“IF}{“else“ELSE}{“int“INT}{“return“RETURN}{“void“VOID}{“while“WHILE} };
void UnGetNextChar() //回退
{
if (!EOF_FLAG)
linepos--;
}
int GetNextChar()
{
if(!(linepos < bufsize))
{
lineno++;
if(fgets(lineBuf255source))
{
bufsize = strlen(lineBuf);
linepos = 0;
return lineBuf[linepos++];
}
else
{
EOF_FLAG=true;
return EOF;
}
}
else
{
return lineBuf[linepos++];
}
}
TokenType IsReserved(char * s)
{
int i;
for (i = 0; i < 6; i++)
{
if(!strcmp(sReserverWords[i].str))
{
return ReserverWords[i].tok;
}
}
return ID;
}
TokenType GetToken()
{
StateType state = START;//初始状态为start
bool save;
TokenType CurrentToken;
int tokenStringIndex = 0;
string assign = ““;
while(state != DONE)
{
int ch = GetNextChar();
save = true; //判断是否是终结状态
switch (state)
{
case START:
if (isdigit(ch))
{
state = INNUM;
}
else if (isalpha(ch))
{
state = INID;
}
else if ((ch == ‘<‘)||(ch == ‘>‘)||(ch == ‘=‘)||(ch == ‘!‘))
{
state = INASSIGN;
assign += char(ch);
}
else if ((ch == ‘ ‘) || (ch == ‘\t‘) || (ch == ‘\n‘))
save = false;
else if (ch == ‘/‘)
{
save = false;
state = PRECOMMENT;
}
else
{
state = DONE;
switch (ch)
{
case EOF:
save = false;
CurrentToken = ENDFILE;
break;
case ‘+‘:
CurrentToken = PLUS;
break;
case ‘-‘:
CurrentToken = MINUS;
break;
case ‘*‘:
CurrentToken = TIMES;
break;
case ‘(‘:
CurrentToken = LPAREN;
break;
case ‘)‘:
CurrentToken = RPAREN;
break;
case ‘;‘:
CurrentToken = SEMI;
break;
case ‘[‘:
CurrentToken = LBRACKET;
break;
case ‘]‘:
CurrentToken = RBRACKET;
break;
case ‘{‘:
CurrentToken = LBRACE;
break;
case ‘}‘:
CurrentToken = RBRACE;
break;
case ‘‘:
CurrentToken = COMMA;
break;
default:
CurrentToken = ERROR;
break;
}
}
break;
case INASSIGN:
if (ch == ‘
- 上一篇:sqlParserC++
- 下一篇:词法分析器(c语言实现)246881
相关资源
- 北京化工大学计算方法(C/C++)讲义
- 北邮-编译原理-词法分析
- GBT 28169-2011 嵌入式软件 C语言编码规范
- XUnZip Zip解压缩.rar
- Windows_API_函数大全 C/C++
- C语言程序设计教材习题参考答案.do
- 基于MFC的VC++仿QQ浏览器源码(雏形)
- 现代编译原理-C语言描述
- 高效FFT的C/C++代码实现包括基2的DIF和
- c/c++开发网络验证和本地验证
- 操作系统存储管理实验报告c/c++
- C++编写的万年历源码
- 编译原理实验报告+代码+使用说明
- C语言进阶源码---基于graphics实现图书
- 井字棋三连棋的AI实现,C/C++
- 编译原理课程设计-C语言子集编译器
- 《水果忍者》设计报告.doc
- MFC实现的红绿灯程序
- 赋值语句翻译c语言实现四元式
- Win32简易画图程序
- C++网络爬虫项目
- 泡泡堂(炸弹人)小游戏C/C++完整源码
- 语法分析c语言实现程序代码+实验报告
- 编译原理用C++消除左递归
- 使用C/C++读取BITMAP的内容
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- VC图像处理-用Canny算子提取边缘
- C/C++视频教程
评论
共有 条评论