词法语法分析程序(可行版)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

说明:此文档包含以下几个文件(程序在Visual C++ 和DEV C++是通过):
(一)文法 第8行到 43行
(二)分类表 第48行到 67行
(三) 验证用程序 第70行到79行
(三)词法分析程序 第81行到499行
(四)语法分析程序 第505 到103
把词法程序和语法程序保存成两个文件,可以把词法分析程序保存成.h文件,语法程序保存成
.cpp文件,新建 Win32 console Application工程,把两文件添加进去即可。

作者:200910405429 昆明理工大学

----以下是文法-----------------------------------------------------------------
<程序> → <语句序列>;

<语句序列> → <语句序列>;<语句> |<语句>

<语句> → |<重复语句>|<赋值语句>||

→ if <表达式> then <语句序列> end | if <表达式> then <语句序列> else <语句序列> end

<重复语句> → repeat <语句序列> until <表达式>

<赋值语句> → <标识符> :=<表达式>

→ read <标识符>

→ write <标识符>

<表达式> → <简单表达式> <比较操作符> <简单表达式> |<简单表达式>

<比较操作符> → < | =

<简单表达式> → <简单表达式> <加减符> <项> | <项>

<加减符> → + | -

<项> → <项> <乘除符> <因子> | <因子>

<乘除符> → * | /

<因子> → (<表达式>) | <数字>|<标识符>

<标识符> → <标识符><字母>|<标识符><数字>|<字母>

<字母> → a|b|c|...|z|A|B|C|...|Z

<数字> → 0|1|2|3|4|5|6|7




----以下是分类-----------------------------------------------------------------

type token
1 :=
2 *||/
3 +||-
4 (
5 )
6 <||=
7 ;
8 数值
9 标识符
10 if
11 then
12 else
13 end
14 repeat
15 until
16 write
17 read

-验证用的程序-----------------------------------------------------------------------
read me;
you:=me;
repeat read me until 145<187;
you:=me;
if 145<189 then write me end;
read me;
if (1145*147)*(145)=250 then read me else read he end;
write me;
-------------------------------------------------------------------------------

//-----------------------词法分析程序---编译原理-------------------------------*
//开发工具 Microsoft Visual C++ 6.0
#include
#include
#include
#define STRING_LENGTH 30
#define TABLE_LEN 500
using namespace std;

/*----------------------------------------------------------------------------*/
//函数原型
int Iskey(string c);
int IsLetter(char c);
int IsDigit(char c);
void Scanner_And_MakeTokenTable(FILE *fp);
void PrintTokenTable();

typedef struct
{
char Token[STRING_LENGTH];
char helper[STRING_LENGTH];//助记符
int current_number;//记录当前的Token数
int tokenType;
int line_num;
int

begin_pos;
} TOKEN;
TOKEN TOKEN_TABLE[TABLE_LEN];

int CurrentMaxToken=0;//当前的Token数
int CurrentLineNumber=1;//当前行数
int char_pos=1;
char ch;
string key[8]={"if","then","else","end","repeat","until","write","read",};

/*----------------------------------------------------------------------------*/
//关键字判断
int Iskey(string c)
{
if(key[0]==c||key[1]==c||key[2]==c||key[3]==c||key[4]==c||key[5]==c||
key[6]==c||key[7]==c)
return 1;
else
return 0;
}

/*----------------------------------------------------------------------------*/
//判断是否为字母
int IsLetter(char c)
{
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
return 1;
else
return 0;
}

/*----------------------------------------------------------------------------*/
//判断是否为数字
int IsDigit(char c)
{
if(c>='0'&&c<='9')
return 1;
else
return 0;
}

/*----------------------------------------------------------------------------*/
//词法分析主要算法
void Scanner_And_MakeTokenTable(FILE *fp)
{
int i=0;
int flag=1;
string arr;
while((ch=fgetc(fp))!=EOF)
{
arr="";

if(ch==' ')
{
char_pos++;
}
else if(ch=='\n')
{
char_pos=1;//重新从一开始计数
CurrentLineNumber++;//换行符,则把行的计数器加1
}


//第一个是字母,且后面是字母或数字则继续扫描,确定是关键字还是标识符
else if(IsLetter(ch))
{
while(IsLetter(ch)||IsDigit(ch))
{
if((ch<='Z')&&(ch>='A'))
ch=ch+32;
arr=arr+ch;
char_pos++;
ch=fgetc(fp);
}
fseek(fp,-1L,SEEK_CUR);/*从当前位置向左偏移*/
if (Iskey(arr))
{
if(arr==key[0])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"if");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=10;
CurrentMaxToken++;
}

else if(arr==key[1])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"then");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;


TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=11;

CurrentMaxToken++;
}

else if(arr==key[2])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"else");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=12;

CurrentMaxToken++;
}

else if(arr==key[3])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"end");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=13;

CurrentMaxToken++;
}

else if(arr==key[4])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"repeat");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=14;

CurrentMaxToken++;
}

else if(arr==key[5])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"until");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=15;

CurrentMaxToken++;
}

else if(arr==key[6])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"write");
strcpy(TOK

EN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=16;

CurrentMaxToken++;
}
else if(arr==key[7])
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,"read");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"关键字");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=17;

CurrentMaxToken++;
}

}

else
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,arr.c_str());
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"标识符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=9;

CurrentMaxToken++;
}
}

else if(IsDigit(ch))//判断是不是实数-(整数,小数)
{
while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fp)))
{
arr=arr+ch;
char_pos++;
ch=fgetc(fp);
}
fseek(fp,-1L,SEEK_CUR);
{
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,arr.c_str());
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"实 数");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(arr.c_str());
TOKEN_TABLE[CurrentMaxToken].tokenType=8;

CurrentMaxToken++;
}
}
else if(ch=='+')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"加 符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_po

s=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=3;

CurrentMaxToken++;
}
else if(ch=='-')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"减 符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=3;

CurrentMaxToken++;
}
else if(ch=='*')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"乘 符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=2;

CurrentMaxToken++;
}
else if(ch=='/')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"除 符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=2;

CurrentMaxToken++;
}
else if(ch=='<')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"比较符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=6;

CurrentMaxToken++;
}
else if(ch=='=')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"比较符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=6;

CurrentMaxToken++;
}
else if(ch=='(')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[Curren

tMaxToken].helper,"左括号");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=4;

CurrentMaxToken++;
}
else if(ch==';')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"分 号");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=7;

CurrentMaxToken++;
}
else if(ch==')')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"右括号");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=5;

CurrentMaxToken++;
}
else if(ch==':')
{
char_pos++;
ch=fgetc(fp);
if(ch=='=')
{
char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,":=");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"赋值符");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-2;//':='占两行
TOKEN_TABLE[CurrentMaxToken].tokenType=1;

CurrentMaxToken++;
}
else
{
//char_pos++;
strcpy(TOKEN_TABLE[CurrentMaxToken].Token,":");
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"未 知");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-1;
TOKEN_TABLE[CurrentMaxToken].tokenType=0;
fseek(fp,-1L,SEEK_CUR);

CurrentMaxToken++;
}
}
else
{
char_pos++;
strcpy(T

OKEN_TABLE[CurrentMaxToken].Token,&ch);
strcpy(TOKEN_TABLE[CurrentMaxToken].helper,"未 知");
TOKEN_TABLE[CurrentMaxToken].current_number=CurrentMaxToken;
TOKEN_TABLE[CurrentMaxToken].line_num=CurrentLineNumber;
TOKEN_TABLE[CurrentMaxToken].begin_pos=char_pos-strlen(&ch);
TOKEN_TABLE[CurrentMaxToken].tokenType=0;

CurrentMaxToken++;
}
}

}

void PrintTokenTable()
{
int i;
cout<<"\n______________________________*---分析结果如下---*_____________________________"<cout<<"\n-Token名_______助记符_______所在行______列________当前tokens数量_______分类____"<for(i=0;i{
cout<<"_______________________________________________________________________________"<cout<
cout<<"\t\t"<cout<<"\t\t"<cout<<"\t"<cout<<"\t\t"<cout<<"\t\t"<
}
cout<<"\n_________________________*---词法分析完毕---*__________________________________"<}

/*--------------------------------主函数--------------------------------------*/
/*void main()
{
FILE * fp;
if((fp=fopen("mylanguage.mlg","r"))==NULL)
cout<else
{
Scanner_And_MakeTokenTable(fp);
fclose(fp);
PrintTokenTable();
system("pause");
}
}*/
/*--------------------------------程序完--------------------------------------*/





/*------------------------语法分析程序---编译原理-----------------------------*/
//开发工具 Microsoft Visual C++ 6.0
#include
#include
#include
#include"myLangScanner.h"
#define STRING_LENGTH 30
#define TABLE_LEN 500
using namespace std;

/*----------------------------------------------------------------------------*/
//全局变量
int current_line=0; //正在处理的当前行
int current_column=0;//正在处理的当前列
int current_token_index =0;
int error_count=0;//用来显示错误的个数

/*----------------------------------------------------------------------------*/
//函数原型
void ChengXu(); //对应<程序> 的处理模块
void YuJuXuLie(); //对应<语句序列>的处理模块
void AAA();//消除<语句序列>的左递归
void YuJu(); //对应<语句>的处理模块
void If_YuJu();//对应的处理模块
void Repeat_YuJu();//对应<重复语句>的处理模块
void FuZhi_YuJu();//对应<赋值语句>的处理模块
vo

id Read_YuJu();//对应的处理模块
void Write_YuJu();//对应的处理模块
void BiaoDaShi(); //对应<表达式>的处理模块
void JianDan_BiaoDaShi();//对应<简单表达式>的处理模块
void BBB();//消除<简单表达式>的左递归
void Xiang();//对应<项>的处理模块
void CCC();//用来消除<项>的左递归
int YinZi();//对应<因子>的处理模块
int BiaoShiFu();//对应<标识符>的处理模块
int BiJiao();//对应<比较操作符>的处理模块
int JiaJian();//对应<加减符>的处理模块
int ChengChu();//对应<乘除符>的处理模块
void ZiMu();//对应<子母>的处理模块
int ShuZi(); //对应<数字>的处理模块
char *token;

/*----------------------------------------------------------------------------*/
//当有错误时,调用此函数
void Error(char * errMsg)
{
error_count++;
if(current_line==0)
{
printf("第%d个ERROR!",error_count);
printf(": 第%d行 第%d列 语句'%s' 附近有语法错误!\n",
CurrentLineNumber,current_column,errMsg);
}
else
{
printf("第%d个ERROR!",error_count);
printf(": 第%d行 第%d列 语句'%s' 附近有语法错误!\n",
current_line,current_column,errMsg);
}
//exit(0); 为了能够看到所有的错误,在此不用exit(0)退出,而是用error_count++来判断程序是对还是错
}

/*----------------------------------------------------------------------------*/
//从Token表中依次取出token
int getToken(char *token)
{
int tkType;
strcpy(token, TOKEN_TABLE[current_token_index].Token );
tkType =TOKEN_TABLE[current_token_index].tokenType ;
current_line =TOKEN_TABLE[current_token_index].line_num;
current_column =TOKEN_TABLE[current_token_index].begin_pos;
current_token_index ++;

return tkType;
}

/*----------------------------------------------------------------------------*/
//指针回退i个Token
void BackwardToken(int i)
{
if (current_token_index - i < 0 ) return;
else
current_token_index = current_token_index -i ;
}

/*----------------------------------------------------------------------------*/
//对应 <程序> 的处理模块。规则为:<程序> → <语句序列>;
void ChengXu()
{
char token[STRING_LENGTH];
YuJuXuLie();

getToken(token);
if (strcmp(token,";")==0)
{
return;
}
else
{
Error(token);
}
}

/*----------------------------------------------------------------------------*/
//规则为:<语句序列> →<语句>void YuJuXuLie()
{
YuJu();
AAA();
}

/*----------------------------------------------------------------------------*/
//消除<语句序列>的左递归: →;<语句>
void AAA()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);


if(tokenType!=7)//ε的情况
{
BackwardToken(1);
return;
}
else
{
tokenType=getToken(token);
if(tokenType==10||tokenType==14||tokenType==9||tokenType==16||tokenType==17)
{
BackwardToken(1);
YuJu();
AAA();
}
else
{
BackwardToken(2);
if(current_line==0)
return;
else
{
Error(token);
}
}
}
}

/*----------------------------------------------------------------------------*/
//规则为:<语句> → |<重复语句>|<赋值语句>||
void YuJu()
{
char token[STRING_LENGTH];
int tokenType;
tokenType=getToken(token);

if(strcmp(token,"if")==0)
{
BackwardToken(1);
If_YuJu();
}
else if(strcmp(token,"repeat")==0)
{
BackwardToken(1);
Repeat_YuJu();
}
else if(strcmp(token,"read")==0)
{
BackwardToken(1);
Read_YuJu();
}
else if(strcmp(token,"write")==0)
{
BackwardToken(1);
Write_YuJu();
}
else if(tokenType==9)
{
BackwardToken(1);
FuZhi_YuJu();
}
else
{
BackwardToken(1);
Error(token);
}
}

/*----------------------------------------------------------------------------*/
//规则为: → if <表达式> then <语句序列> end | if <表达式> then <语句序列> else <语句序列> end
void If_YuJu()
{
char token[STRING_LENGTH];

getToken(token);
if(strcmp(token,"if")!=0)
Error(token);

BiaoDaShi();

getToken(token);
if(strcmp(token,"then")!=0)
Error(token);

YuJuXuLie();

getToken(token);
if(strcmp(token,"else")!=0)
{
if(strcmp(token,"end")!=0)
Error(token);
}
else
{
YuJuXuLie();
getToken(token);
if(strcmp(token,"end")!=0)
Error(token);
}
}

/*----------------------------------------------------------------------------*/
//规则为:<重复语句> → repeat <语句序列> until <表达式>
void Repeat_YuJu()
{
char token[STRING_LENGTH];

getToken(token);
if(strcmp(token,"repeat")!=0)
Error(token);

YuJuXuLie();

getToken(token);
if(strcmp(token,"until")!=0)
Error(token);

BiaoDaShi();
}

/*----------------------------------------------------------------------------*/
//规则为:<赋值语句> → <标识符> :=<表达式>
void FuZhi_YuJu()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType!=9)
{
Error(token);
}
tokenType=getToken(token);
if(tokenType!=1)

{
Error(token);
}

BiaoDaShi();
}

/*----------------------------------------------------------------------------*/
//规则为: → read <标识符>
void Read_YuJu()
{
char token[STRING_LENGTH];

getToken(token);
if(strcmp(token,"read")!=0)
Error(token);

if(BiaoShiFu()!=1)
Error(token);
}

/*----------------------------------------------------------------------------*/
//规则为: → write <标识符>
void Write_YuJu()
{
char token[STRING_LENGTH];

getToken(token);
if(strcmp(token,"write")!=0)
Error(token);

if(BiaoShiFu()!=1)
Error(token);
}

/*----------------------------------------------------------------------------*/
//规则为:<表达式> → <简单表达式> <比较操作符> <简单表达式> |<简单表达式>
void BiaoDaShi()
{
char token[STRING_LENGTH];
int tokenType;

JianDan_BiaoDaShi();

tokenType=getToken(token);
if(tokenType==6)
{
JianDan_BiaoDaShi();
}
else
{
BackwardToken(1);
return;
}
}

/*----------------------------------------------------------------------------*/
//规则为:<简单表达式> → <项>
void JianDan_BiaoDaShi()
{
Xiang();
BBB();
}

/*----------------------------------------------------------------------------*/
//消除左递归,规则为:→<加减符> <项>
void BBB()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType!=3)
{
BackwardToken(1);
return;
}
else
{
Xiang();
BBB();
}
}

/*----------------------------------------------------------------------------*/
//规则为:<项> →<因子>
void Xiang()
{
if(YinZi()==1)
{
CCC();
}
else
Error(token);
}

/*----------------------------------------------------------------------------*/
//消除左递归,规则为:→<乘除符> <因子>
void CCC()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType!=2)//ε的情况
{
BackwardToken(1);
return;
}
else
{
if((YinZi()==1))
{
CCC();
}
else
{
Error(token);
}
}
}

/*----------------------------------------------------------------------------*/
//规则为:<因子> → (<表达式>) | <数字>|<标识符>
int YinZi()
{
char token[STRING_LENGTH];

if(ShuZi()==1)
{
return 1;
}
else if(BiaoShiFu()==1)
{
return 1;
}
else
{
getToken(token);
if(strcmp(token,"(")==0)
{
BiaoDaShi();

getToken(token);
if(strcmp(token,")"

)==0)
{
return 1;
}
else
{
BackwardToken(1);
return 0;
}
}
else
{
BackwardToken(1);
return 0;
}
}
}

/*----------------------------------------------------------------------------*/
//规则为:<标识符> → <标识符><字母>|<标识符><数字>|<字母>
int BiaoShiFu()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType==9)
return 1;
else
{
BackwardToken(1);
return 0;
}
}

/*----------------------------------------------------------------------------*/
//规则为:<比较操作符> → < | =
int BiJiao()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType==6)
return 1;
else
{
BackwardToken(1);
return 0;
}
}

/*----------------------------------------------------------------------------*/
//规则为:<加减符> → + | -
int JiaJian()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType==3)
return 1;
else
{
BackwardToken(1);
return 0;
}
}

/*----------------------------------------------------------------------------*/
//规则为:<乘除符> → * | /
int ChengChu()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType==2)
return 1;
else
{
BackwardToken(1);
return 0;
}
}

/*----------------------------------------------------------------------------*/
//规则为:<数字> → 0|1|2|3|4|5|6|7
int ShuZi()
{
char token[STRING_LENGTH];
int tokenType;

tokenType=getToken(token);
if(tokenType==8)
return 1;
else
{
BackwardToken(1);
return 0;
}
}

/*-分析程序-------------------------------------------------------------------*/
void SyntaxParser()
{
printf("正在进行语法分析...\n");
ChengXu();
}

/*--主函数--------------------------------------------------------------------*/
int main()
{
FILE * fp;
if((fp=fopen("mylanguage.mlg","r"))==NULL)
cout<else
{
Scanner_And_MakeTokenTable(fp);
PrintTokenTable();


SyntaxParser();

if(error_count==0)
{
printf("\n恭喜!语法分析成功!\n"); //没有错误则成功
}
}
getchar();
return 0;
}
/*------------------------------完毕----------------------------------------*/

相关文档
最新文档