资源简介

编译原理-递归下降语法分析器源代码,手写有注释,能打印出语法树,进行部分错误处理,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 == ‘

评论

共有 条评论