資源簡介
編譯原理-遞歸下降語法分析器源代碼,手寫有注釋,能打印出語法樹,進行部分錯誤處理,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? {
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語言實現
評論
共有 條評論