资源简介
内容:
一共有实验一和实验二两个实验,每个实验有4次课8个学时;
实验一完成词法分析;
实验二完成语法、语义分析及中间代码生成。
两个实验完成后最终效果:
实现一个简单的集成开发环境(IDE),可以编辑源代码、有“编译”、“运行”等功能;
需要显示所有的错误信息、扫描结果、语法分析结果、中间代码和汇编代码
(做实验一时可以使用命令行界面)

代码片段和文件信息
#include
#include
#include
#include
using namespace std;
int Test(char[200]);
int AddIdentifier(char[20]);
int FindIdentifier(char[20]);
bool Isnum(char[20]); //判断是否合法标识符
void Load(char[30]);
void WordSplit(char[30]);
void Display(char[200] int[10000] int&);
void Errors(int[10000] int&);
char Identifiers[1000][50];
int Counts; //记录存储字符常量个数
int huanhang=0; //记录每一行输出多少个了
bool isStr=false;//用于判断转义字符串是ID还是STR,因为STR的单引号没有放到word数组里
int main(){
char filepath[30];
cout<<“请输入要分析的程序文件名称:“;
while(cin>>filepath){
Load(filepath); //对指定文件进行词法分析
cout<<‘\n‘<<‘\n‘;
cout<<“请输入要分析的程序文件名称:“;
}
return 0;
}
int Test(char word[200]){
char Keys[36][20]={““ “true“ “false“ “or“ “and“ “not“ “int“ “bool“ “string“ “while“ “do“ “if“ “then“ “else“ “end“ “repeat“ “until“ “read“ “write“ “>“ “<=“ “>=“ ““ “‘“ “{“ “}“ “;“ “:=“ “+“ “-“ “*“ “/“ “(“ “)“ “<“ “=“};
if(word[0]>=‘0‘&&word[0]<=‘9‘){
if (word[0] == ‘0‘ && (word[1] == ‘x‘ || word[1] == ‘X‘))
{
for (int i = 2; i < strlen(word)-1; i++)
if (!(word[i]>=‘a‘&&word[i]<=‘f‘||word[i]>=‘A‘&&word[i]<=‘F‘||word[i]>=‘0‘&&word[i]<=‘9‘))
return -6;//错误的十六进制数
return 37;
}
else if(!Isnum(word))
return -6; //非法标示符,以数字开头,返回-2
else return 37; //识别为NUM
}
for(int j=1; j<36; j++){ //识别为KEY
if(strcmp(Keys[j] word)==0)
return j;
}
if (word[0] == ‘\\‘&& isStr==true)//识别STR出现“\”,也认为是STR
return 38;
if (word[0] == ‘\\‘&& isStr==false)//识别转义字符
return 40;
if(!(word[0]>=‘a‘&&word[0]<=‘z‘||word[0]>=‘A‘&&word[0]<=‘Z‘||word[0]>=‘0‘&&word[0]<=‘9‘||word[0]==‘\‘‘))
return -1;
if (word[0] != ‘\‘‘ && word[strlen(word)-1] == ‘\‘‘)//缺少左单引号
return -2;
if (word[0] == ‘\‘‘ && word[strlen(word)-1] != ‘\‘‘)//缺少右单引号
return -3;
if (word[0] != ‘{‘ && word[strlen(word)-1] == ‘}‘)//缺少左大括号
return -4;
if (word[0] == ‘{‘ && word[strlen(word)-1] != ‘}‘)//缺少右大括号
return -5;
if(isStr==false&&((word[0]>=‘a‘&&word[0]<=‘z‘||word[0]>=‘A‘&&word[0]<=‘Z‘)))//识别为ID
return 36;
if (isStr==true)//识别为STR
return 38;
if (word[0] == ‘{‘ && word[strlen(word)-1] == ‘}‘)//识别为注释
return 39;
return 50;//未识别符号
}
bool Isnum(char word[20]){
for(int i=1; word[i]!=‘\0‘; i++){
if(word[i]<‘0‘||word[i]>‘9‘)
return false;
}
return true;
}
void Load(char FilePath[30]){
Counts=0; //清空之前字符常量记录
WordSplit(FilePath);
}
void WordSplit(char fpath[30])
{
ifstream inf(fpath ios::in);//打开文件
int row[10000]={0}; //记录每一行是否有错
int r=1; //记录行数
char ch;
ch=inf.get();
int c=0; //记录输出个数
while(ch!=EOF) //文件尾
{
isStr=false;
while(ch==‘ ‘||ch==‘\t‘)
ch=inf.get(); //过滤空格
while(ch==‘\n‘)
{
r++; //换行
ch=inf.get();
}
int i=0;
char word[200]={‘ ‘};
if(ch>=‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘)
{
//##############首位为字母时###
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-03-04 19:38 编译原理实验\
目录 0 2013-03-04 19:38 编译原理实验\实验测试数据\
文件 314 2012-09-12 11:42 编译原理实验\实验测试数据\experiment1_test1_in.txt
文件 408 2012-09-12 11:42 编译原理实验\实验测试数据\experiment1_test1_out.txt
文件 113 2012-09-12 11:42 编译原理实验\实验测试数据\experiment1_test2_in.txt
文件 334 2012-09-12 11:42 编译原理实验\实验测试数据\experiment1_test2_out.txt
文件 124 2012-09-12 11:42 编译原理实验\实验测试数据\experiment2_test1_in.txt
文件 336 2012-09-12 11:42 编译原理实验\实验测试数据\experiment2_test1_out.txt
文件 148 2012-09-12 11:42 编译原理实验\实验测试数据\experiment2_test2_in.txt
文件 322 2012-09-12 11:42 编译原理实验\实验测试数据\experiment2_test2_out.txt
文件 294 2012-09-12 11:42 编译原理实验\实验测试数据\说明.txt
目录 0 2013-03-04 19:38 编译原理实验\实验资料\
文件 36352 2012-09-12 11:42 编译原理实验\实验资料\TINY+ EBNF文法.doc
文件 46080 2012-09-12 11:42 编译原理实验\实验资料\TINY+.doc
文件 59392 2012-09-12 11:42 编译原理实验\实验资料\实验.doc
文件 121344 2012-11-14 10:42 编译原理实验\实验资料\实验1 指南.ppt
文件 159744 2012-11-13 18:15 编译原理实验\实验资料\实验2 指南.ppt
文件 126464 2012-09-12 11:42 编译原理实验\实验资料\编译原理实验报告模板.doc
文件 114176 2012-09-12 11:42 编译原理实验\实验资料\编译原理实验报告要求.doc
目录 0 2013-03-04 19:38 编译原理实验\词法分析\
目录 0 2013-03-04 19:38 编译原理实验\词法分析\Debug\
文件 51200 2012-11-26 21:00 编译原理实验\词法分析\Debug\词法分析.exe
文件 412316 2012-11-26 21:00 编译原理实验\词法分析\Debug\词法分析.ilk
文件 650240 2012-11-26 21:00 编译原理实验\词法分析\Debug\词法分析.pdb
目录 0 2013-03-04 19:38 编译原理实验\词法分析\词法分析\
目录 0 2013-03-04 19:38 编译原理实验\词法分析\词法分析\Debug\
文件 6740 2012-11-26 21:00 编译原理实验\词法分析\词法分析\Debug\BuildLog.htm
文件 76189 2012-11-26 21:00 编译原理实验\词法分析\词法分析\Debug\WordsAnalyser.obj
文件 65 2012-11-26 21:00 编译原理实验\词法分析\词法分析\Debug\mt.dep
文件 314368 2012-11-26 21:00 编译原理实验\词法分析\词法分析\Debug\vc90.idb
文件 225280 2012-11-26 21:00 编译原理实验\词法分析\词法分析\Debug\vc90.pdb
............此处省略63个文件信息
相关资源
- 实验三 消息中间件应用开发:Active
- 基于stm32f103ve的程序——跑马灯实验
- 周立功开发板ProASIC3实验-syn_FIFO代码
- 编译原理实验工具及参考源码(lex&
- dotnet 写字板 实验 源代码 不好请要不
- 类pascal语言编译器(编译原理实验)
- 数学建模实验报告(八个全)
- 数值分析所有实验代码
- 数字逻辑与数字系统实验报告
- 多媒体综合设计报告(附作品)
- ubuntu9.10 可加载内核模块和字符设备驱
- 编译原理课程设计:词法语法编译器
- 操作系统 LRU算法 实验报告 及 程序代
- 分页系统模拟实验 操作系统 课程设
- 中科院 编译原理 习题及解答
- 数据结构实验魔王语言
- 编译原理四元式和逆波兰式
- 迈克尔逊干涉仪的调整与使用实验报
- 8259A中断控制实验
- 操作系统实验——虚存管理实验
- 广工操作系统实验
- 广东工业大学操作系统实验四文件系
- 广东工业大学汇编实验二用表格形式
- 数值计算实验源代码
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 数据结构实验 基于栈的表达式求值
- 利用启发式搜索解决八数码难题程序
- 武汉理工大学面向对象实验
- 计组实验(ALU的设计)
评论
共有 条评论