• 大小: 1.01MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-10-30
  • 语言: 其他
  • 标签: 杭电  编译原理  

资源简介

杭电编译原理语法分析器 内含杭电编译原理语法分析器源代码 每行基本上有注释 容易懂

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

#define Max 655  //最大代码长度
#define WordMaxNum 256  //变量最大个数
#define DigitNum 256 //常量最大个数
#define MaxKeyWord 32 //关键字数量
#define MaxOptANum 8 //运算符最大个数
#define MaxOptBNum 4 //运算符最大个数
#define MaxEndNum 11 //界符最大个数

typedef struct DisplayTable
{
int Index;  //标识符所在表的下标
int type; //标识符的类型
int line; //标识符所在表的行数
char symbol[20]; //标识符所在表的名称
}Table;

int TableNum = 0;  //display表的表项总数
int WordNum = 0;   //变量的个数
int DigNum = 0;  //常量的个数
bool errorFlag = 0; //错误标志
int TableIndex = -1;  //display 表的下标索引
int beginCount = 0;//遇到begin加1,遇到end减1
int ifCount = 0; //遇到if加1
Table *table = new Table[Max];

//关键字
const char* const KeyWord[MaxKeyWord] = {“and““array“ “begin““case““char““constant““do““else““end““false““for““if““input““integer““not““of““or““output“
“packed““procedure““program““read““real““repeat““set“ “then“ “to“ “type“ “until“ “var““while“ “with“};    


// 单目运算
const char OptA[] = {‘+‘‘-‘‘*‘‘/‘‘=‘‘#‘‘<‘‘>‘};

//双目运算符
const char *OptB[] = {“<=““>=““:=““<>“};
// 界符
const char End[] = {‘(‘ ‘)‘  ‘‘  ‘;‘  ‘.‘  ‘[‘  ‘]‘  ‘:‘  ‘{‘  ‘}‘  ‘“‘}; 

void error(char str[20]int nLine int errorType)
{
 errorFlag = 1;//将错误标志置1,代表程序出现过错误

 cout <<“ \nError :    “;
 switch(errorType)
 {
 case 1:
cout << “第“ << nLine-1 <<“行“ << str << “ 变量的长度超过限制!\n“;
   break;
  case 2:
cout << “第“ << nLine-1 <<“行“ << str << “ 小数点错误!\n“;
  break;
case 3:
cout << “第“ << nLine-1 <<“行“ << str << “ 常量的长度超过限制!\n“;
break;
}//switch
}//error

void Scanner(char ch[]int chLenint nLine)
{
int chIndex = 0; 
while(chIndex < chLen) //对输入的字符扫描
{
/****************处理空格和tab***************************/
//忽略空格和tab
while(ch[chIndex] == ‘ ‘ || ch[chIndex] == 9 )   

chIndex ++; 
}
/*************************处理换行符*********************/
  //遇到换行符,行数加1
while(ch[chIndex] == 10)
{
nLine++;
chIndex ++;
}

/***************************标识符**********************/
if( isalpha(ch[chIndex])) //以字母、下划线开头
{
 char str[256];
 int strLen = 0;
//是字母、下划线
 while(isalpha(ch[chIndex]) || ch[chIndex] == ‘_‘ )
 {
 str[strLen ++] = ch[chIndex];
 chIndex ++;
while(isdigit(ch[chIndex]))//不是第一位,可以为数字
{
str[strLen ++] = ch[chIndex];
chIndex ++;
}
}
str[strLen] = 0; //字符串结束符

//开始匹配
if(strlen(str) > 20) //标识符超过规定长度,报错处理
{
error(strnLine1);
}
else
{
int i;
for(i = 0;i < MaxKeyWord; i++) //与关键字匹配,是关键字,写入table表中
{
if(strcmp(str KeyWord[i]) == 0)

strcpy(table[TableNum].symbolstr);
table[TableNum].type = 1;  //关键字
table[TableNum].line = nLine;
table[TableNum].Index = i;
TableNum ++;
break;
}
}
if(i >= MaxKeyWord) //不是关键字
{
table[Tabl

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      15768  2012-05-20 16:01  code w\code.cpp

     文件       3381  2012-05-19 16:18  code w\code.dsp

     文件        533  2012-05-19 16:18  code w\code.dsw

     文件      41984  2012-05-20 16:02  code w\code.ncb

     文件      49664  2012-05-20 16:02  code w\code.opt

     文件        242  2012-05-20 16:02  code w\code.plg

     文件        309  2012-05-20 16:02  code w\test.txt

     文件     287744  2012-05-20 16:02  code w\Debug\code.bsc

     文件     565307  2012-05-20 16:02  code w\Debug\code.exe

     文件     807280  2012-05-20 16:02  code w\Debug\code.ilk

     文件     284920  2012-05-20 16:02  code w\Debug\code.obj

     文件    2267748  2012-05-20 15:50  code w\Debug\code.pch

     文件    1106944  2012-05-20 16:02  code w\Debug\code.pdb

     文件          0  2012-05-20 16:02  code w\Debug\code.sbr

     文件      74752  2012-05-20 16:02  code w\Debug\vc60.idb

     文件     110592  2012-05-20 16:02  code w\Debug\vc60.pdb

     目录          0  2012-05-20 16:02  code w\Debug

     目录          0  2012-05-20 16:03  code w

----------- ---------  ---------- -----  ----

              5617168                    18


评论

共有 条评论