资源简介
实验课上写的编译原理的语义分析和四元式代码的生成。
代码片段和文件信息
#include
#include
#include
#include
#define reser 20
using namespace std;
char *charstring = “abcdefghijklmnopqrstuvwxyz“;
char *numstring = “0123456789“;
char *strstring = “abcdefghijklmnopqrstuvwxyz0123456789“;
char reserve[reser][10];
char idshed[40][10] opshed[40][10];
char token[15] id[15] sym[15];
char line[80] tempp[240];
char ch temp tem;
char tx[10] tn[4] signt1[20] signt2[20] ju[20];
int cc ii k kind t e4 = 0 e3 = 0 judge = 1 row1 = 0;
int startc idsh = 0 opsh = 0 tt = 1 nn = 1 adds = 0 pp = 0;
int li = 0;
FILE *fp;
void getch(){
if ( li == 0 ){
if ( cc == ii ){
cc = 1; ii = 0;
if ( row1 == 1 )
fseek( fp -1 1 ); /*读行首字符将指针退回一格,若是整个文本的开头,则不需要*/
line[0] = fgetc( fp );
row1 = 1;
while ( ( (temp = fgetc( fp ) ) != ‘\n‘) && (temp != EOF) ){
line[cc++] = temp;
tempp[pp++] = temp;
}
line[cc++] = ‘ ‘; /*将缓冲带后加上一个空字符,以便行和行之间号区分 */
tempp[pp++] = ‘ ‘;
while ( ( (temp = fgetc( fp ) ) == ‘\n‘) && (temp != EOF) ); /* 跳过空行*/
line[cc] = ‘\0‘;
}
tem = line[ii++];
ch = tem;
} else
ch = tempp[pp++];
}
void getnbc(){
getch();
while ( ch == ‘ ‘ )
getch();
if ( ch == ‘{‘ ){
do{
getch();
} while ( ch == ‘}‘ );
getnbc();
}
}
//判断ch是不是字母
int jchar( char ch ){
if ( strchr( charstring ch ) == 0 )
return 0;
else return 1;
}
//判断ch是不是数字
int jnum( char ch ){
if ( strchr( numstring ch ) == 0 )
return 0;
else return 1;
}
//判断ch是不是字母或数字
int jstr( char ch ){
if ( strchr( strstring ch ) == 0 )
return 0;
else return 1;
}
void advance(){
getnbc();
kind = 0;
if ( jchar( ch ) == 1 ){
k = 0;
do{
if ( k < 15 )
token[k++] = ch;
getch();
} while ( jstr( ch ) == 1 );
if ( li == 0 )
ii--;
else pp--;
token[k] = ‘\0‘; /*截去token中的无用字符*/
strcpy( id token );
for ( t = 0; t <= 20; t++ ){
if ( strcmp( reserve[t] id ) == 0 )
break;
}
if ( t <= 20 )
kind = t;
else kind = 21;
strcpy( sym id );
} else
if ( jnum( ch ) == 1 ){
k = 0;
do{
if ( k < 15 )
token[k++] = ch;
getch();
}
while ( jstr( ch ) == 1 );
if ( li == 0 )
ii--;
else pp--;
kind = 22;
token[k] = ‘\0‘;
strcpy( sym token );
} else {
if ( ch == ‘.‘ )
kind = 26;
k = 0;
do{
sym[k++] = ‘ ‘;
}
while ( k != 15 );
sym[0] = ch;
sym[1] = ‘\0‘;
}
}
void error( int n ){
judge = 0; /*出错退出,将judge=0*/
switch ( n ){
case 0: { printf( “ Error(0):Expect ‘:‘ \n“ ); break; }
case 1: { printf( “ Error(1):Expect ‘=‘ \n“ ); break; }
case 2: { printf( “ Error(2):Syntax error \n“ ); break; }
case 3: { printf( “ Error(3):Except Operater \n“ ); break; }
case 4: { printf( “ Error(4):Except ID or NUM \n“ ); break; }
case 5: { printf( “ Error(5):Except ‘;‘ \n“ ); break; }
ca
- 上一篇:预测分析语法分析器(c++源代码)
- 下一篇:C语言程序 泊车系统
相关资源
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- LL1语义分析的C语言子集编译器
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
- 编译原理与技术李文生:LR分析法C+
评论
共有 条评论