资源简介

内容: 一共有实验一和实验二两个实验,每个实验有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个文件信息

评论

共有 条评论