资源简介
杭电编译原理语法分析器 内含杭电编译原理语法分析器源代码 每行基本上有注释 容易懂
代码片段和文件信息
#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
- 上一篇:DW网页设计100例
- 下一篇:Agilent 33250A使用手册
相关资源
- 编译原理答案第二版 刘坚 编著
- LR0语法分析器
- 华工编译原理实验词法分析+语法分析
- 编译原理课件及实验源代码实验报告
- 东南大学编译原理实验 lex&&yacc
- 北方工业大学编译原理话语法分析实
- 东华大学 姚砺 编译原理作业答案
- 编译原理语法分析器课程设计完美版
- 简单的PL0编译器
- First集和Follow集生成算法模拟
- 实验四LL(1)分析器的生成
- 词法分析器有界面
- 武汉大学国际软件学院解释器构造作
- 编译原理课程设计(词法分析和语法
- 国防科技大学计算机系602教研室王挺
- 编译原理-陈火旺-第三版
- 《编译原理》第二版(陈意云 著)课
- 华工编译原理TINY+
- 上海大学 编译原理实验报告
- 《编译原理教程》习题解析与上机指
- 编译原理课后习题答案
- 《编译原理》胡元义课后习题解析
- 编译原理学习指导与典型题解析
- 程序设计语言编译原理(陈火旺第3版
- 编译原理第二版清华大学
- 数据结构期末复习+试卷--杭电
- 基于LR(0)方法的语法分析程序
- 编译原理~金成植版课后答案~
- 《编译原理(第3版).pdf》
- 编译原理的实验12376
评论
共有 条评论