没有合适的资源?快使用搜索试试~ 我知道了~
电子科技大学-计算机学院-编译原理实验-语法分析[参照].pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 148 浏览量
2021-10-12
04:59:26
上传
评论
收藏 208KB PDF 举报
温馨提示
试读
26页
电子科技大学-计算机学院-编译原理实验-语法分析[参照].pdf
资源推荐
资源详情
资源评论
// SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#define MAX_COUNT 1024
#define SIGN_UNDEFINED_ERR 1
#define SIGN_REDEFINED_ERR 2
#define SIGN_EXECUTE_ERR 3
#define NO_SIGN_ERR 4
#define SIGN_RESERVE_ERR 5
#define NO_PARA_ERR 6
/*types 是支持类型的集合 */
typedef enum{ integer } types ;
/* 记录变量信息的结构体 */
typedef struct {
char vname[17];
char vproc[17];
bool vkind;
types vtype;
int vlev;
int vadr;
} varRecord ;
/* 记录过程信息的结构体 */
typedef struct {
char pname[17];
types ptype;
int plev;
int varNum;
int fadr;
int ladr;
int parameter;
bool parameterIsDefined;
} proRecord ;
/********** 文法产生式如下 **********
A:程序 A->B
B:分程序 B->begin C;M end
C:说明与句表 C->DC'
C'->;DC'| ε
D:说明语句 D->E|J
E:变量说明 E->integer F
F:变量 F->G
G:标识符 G->HG'
G'->HG'|IG'| ε
H:字母 H->a|...|z|A|...|Z
I :数字 I->0|1|...|9
J:函数说明 J->integer function G(K);L
K:参数 K->F
L:函数体 L->begin C;M end
M:执行语句表 M->NM'
M'->;NM'| ε
N:执行语句 N->O|P|Q|W
O:读语句 O->read(F)
P:写语句 P->write(F)
Q:赋值语句 Q->F:=R
R:算术表达式 R->SR'
R'->-SR'| ε
S:项 S->TS'
S'->*TS'| ε
T:因子 T->F|U|Z
U:常数 U->V
V:无符号整数 V->IV'
V'->IV'| ε
W:条件语句 W->if X then N else N
X:条件表达式 X->RYR
Y:关系运算符 Y-><|<=|>|>=|=|<>
Z:函数调用 Z->G(R)
**********************************/
void A();
void B();
void C();
void C_();
void D();
void E();
void F();
void G();
void J();
void K();
void L();
void M();
void M_();
void N();
void O();
void P();
void Q();
void R();
void R_();
void S();
void S_();
void T();
void U();
void W();
void X();
void Y();
void Z();
/* 初始化函数:从输入文件读取数据,建立各个文件,初始化全局变量 */
bool init( int argc, char * argv[]);
/* 结束处理函数,将 var 和 pro 数组中的元素输出到相应文件,填充输出文件 */
bool final();
/* 错误处理函数,参数分别为行号、错误码和错误符号 */
bool error( int lineNum, int errNum, const char * sign);
/* 获得所处目录路径,包括最后斜杠,或者为空 */
void getPath( char * in, char * out);
/* 获得文件名,不包括扩展 */
void getFilename( char * in, char * out);
/* 获得下一符号 ,true 表示已到队尾, false 表示还未到队尾 */
bool nextToken();
/* 获得当前符号的下一字符 ,true 表示已到 '\0'*/
bool nextChar();
/* 判断变量是否已存在 */
bool isVarExisted( char * vname, char * vproc, bool vkind);
/* 判断过程是否已存在,参数为过程名 */
bool isProExisted( char * vname);
/* 获得下一符号,指针不变 */
int getNextToken();
char input[ MAX_COUNT][17]; // 存放输入文件所有符号的数组
int kind[ MAX_COUNT];
int inputCount; // 输入符号的数量
int pToken; // 指向当前输入符号
int pChar; // 指向当前输入符号中的当前字符
varRecord currentVar; // 存放当前变量的信息
proRecord currentPro; // 存放当前过程的信息
int lineNum; // 当前行号
varRecord var[ MAX_COUNT]; // 存放变量名表项数组
proRecord pro[ MAX_COUNT]; // 存放过程名表项数组
int varCount; // 变量的数量
int proCount; // 过程的数量
FILE* inFile; // 输入文件句柄
FILE* outFile; // 输出文件句柄
FILE* errFile; // 错误文件句柄
FILE* varFile; // 变量文件句柄
FILE* proFile; // 过程文件句柄
/* 主函数 */
int main( int argc , char * argv [])
{
if (init( argc , argv ))
{
A();
final();
}
return 0;
}
bool init( int argc , char * argv [])
{
if ( argc != 2)
{
return false ;
}
else
{
char * inFilename = argv [1];
char outFilename[ MAX_COUNT] = "" ;
char errFilename[ MAX_COUNT] = "" ;
char varFilename[ MAX_COUNT] = "" ;
char proFilename[ MAX_COUNT] = "" ;
char filename[ MAX_COUNT] = "" ;
char path[ MAX_COUNT] = "" ;
// 获得文件名(不包括扩展名)和路径
getFilename(inFilename, filename);
getPath(inFilename, path);
// 生成输出文件全部路径
strcat(outFilename, path);
//strcat(outFilename, "\\");
strcat(outFilename, filename);
strcat(outFilename, ".dys" );
// 生成错误文件全部路径
strcat(errFilename, path);
//strcat(errFilename, "\\");
strcat(errFilename, filename);
strcat(errFilename, ".err" );
// 生成变量文件全部路径
strcat(varFilename, path);
//strcat(varFilename, "\\");
strcat(varFilename, filename);
strcat(varFilename, ".var" );
// 生成过程文件全部路径
strcat(proFilename, path);
//strcat(proFilename, "\\");
strcat(proFilename, filename);
strcat(proFilename, ".pro" );
// 打开文件句柄
if ((inFile = fopen(inFilename, "r" )) && (outFile = fopen(outFilename, "w")) &&
(errFile = fopen(errFilename, "w")) && (varFile = fopen(varFilename, "w" )) && (proFile =
fopen(proFilename, "w" )))
{
// 初始化单词指针、字符指针、行号、层次
inputCount = 0;
pToken = 0;
pChar = 0;
lineNum = 1; // 当前行号
//level = 0;// 当前层次
//varCountInPro = 0;
strcpy(currentPro.pname, "" );
currentPro.plev = 0;
剩余25页未读,继续阅读
资源评论
czq131452007
- 粉丝: 2
- 资源: 12万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功