资源简介

编译原理课程设计 for循环 用LR法实现 中间代码用三元式表示

资源截图

代码片段和文件信息

#include“init.h“

int main(){
input();//输入
scanner();//扫描输入串进行词法分析,词法分析存于tokenList中,有单词和类型码
grammar();//语法分析和语义分析,二者穿插进行
outfile1.close();//关闭打开的文件
outfile2.close();//关闭打开的文件
outfile3.close();//关闭打开的文件
return 0;
}

void input(){//输入函数,以#控制
char c;
cout<<“******************BEGIN*******************“< cout<<“*            for循环语句的分析           *“< cout<<“*                                        *“< cout<<“*包括的内容如下:                         *“< cout<<“*1.词法分析                              *“< cout<<“*2.语法分析                              *“< cout<<“*3.语义分析                              *“< cout<<“*                                        *“< cout<<“*****************END**********************“< cout< cout<<“请输入for循环语句并以#结束:“< do{     
c=cin.get();
s+=c;
}while(c!=‘#‘);//不以#结尾则重新输入


void scanner(){
int t;
while(num switch(sort(s[num])){
case 0:
error();
num++;
break;
case 1: 
t=recog_id(s[num]);
if(t==-1)error();
break;
case 2:t=recog_dig(s[num]);
if(t==-1)error();
break;
case 3:t=recog_delimeter(s[num]);
if(t==-1)error();
break;
case 4:t=recog_oper(s[num]);
if(t==-1)error();
break;
case 5:
num++;
break;
}
}
write_token();
}

int sort(char ch){//排序函数
if(isalpha(ch) || ch==‘_‘)return 1;//标识符以字母或下划线开始
else if(isdigit(ch))return 2;//数字
else if(isin(chdelimeter12))return 3;//若是‘,则是字符常数
else if(isin(choper10))return 4;//若是其他符号
else if(ch==‘ ‘ || ch==9)return 5;//9表示水平制表符
else return 0;
}

int recog_id(char ch){//ch为给定字符串的第一个字符
char state=‘0‘;//出示状态为0
while(state!=‘2‘){
switch(state){
case ‘0‘://若当前是状态0,读入一个字母或下划线,转向状态1
if(isalpha(ch) || ch==‘_‘){
state=‘1‘;
tokenList[count].word.push_back(ch);
tokenList[count].token=0;
}
else return -1;
break;
case ‘1‘://若当前是状态1,读入字母或数字或下划线,仍为状态1
if(isalpha(ch) || isdigit(ch) || ch==‘_‘){
state=‘1‘;
tokenList[count].word.push_back(ch);
}
else{
state=‘2‘;
tokenList[count].token=2;
num--;//退回当前读入的字符
}
}
ch=s[++num];
}
string str;//截取字符串,并判断是否是关键字
for(int i=0;i str+=tokenList[count].word[i];
}
if(isin(strkeyword33))tokenList[count].token=1;
count++;
return 0;
}

int recog_dig(char ch){//识别常数
char state=‘0‘;//初始状态为0
while(state!=‘7‘){
switch(state){
case ‘0‘:
if(isdigit(ch)){
state=‘1‘;
tokenList[count].word.push_back(ch);
tokenList[count].token=0;
}
else return -1;
break;//读入一个数字
case ‘1‘:
if(isdigit(ch)){
state=‘1‘;
tokenList[count].word.push_back(ch);
}//仍然读入数字
else if(ch==‘.‘){
state=‘2‘;
tokenList[count].word.push_back(ch);
}//读入小数点,识别实数
else if(ch==‘e‘ || ch==‘E‘){
state=‘4‘;
tokenList[count].word.push_back(ch);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     630821  2009-06-18 19:40  编译原理课程设计for循环\Debug\for.exe

     文件     853372  2009-06-18 19:40  编译原理课程设计for循环\Debug\for.ilk

     文件    2568072  2009-06-18 18:53  编译原理课程设计for循环\Debug\for.pch

     文件    1188864  2009-06-18 19:08  编译原理课程设计for循环\Debug\for.pdb

     文件     434801  2009-06-18 19:40  编译原理课程设计for循环\Debug\main.obj

     文件      82944  2009-06-18 19:41  编译原理课程设计for循环\Debug\vc60.idb

     文件     135168  2009-06-18 19:08  编译原理课程设计for循环\Debug\vc60.pdb

     文件       4308  2009-06-18 19:39  编译原理课程设计for循环\for.dsp

     文件        529  2009-06-18 18:52  编译原理课程设计for循环\for.dsw

     文件      41984  2009-06-18 19:42  编译原理课程设计for循环\for.ncb

     文件      53760  2009-06-18 19:42  编译原理课程设计for循环\for.opt

     文件        871  2009-06-18 19:40  编译原理课程设计for循环\for.plg

     文件       4733  2009-06-18 18:53  编译原理课程设计for循环\init.h

     文件      20628  2009-06-21 19:44  编译原理课程设计for循环\main.cpp

     文件        219  2009-06-18 01:03  编译原理课程设计for循环\产生式.txt

     文件        350  2009-06-18 19:40  编译原理课程设计for循环\词法分析结果.txt

     文件        186  2009-06-18 19:40  编译原理课程设计for循环\语义分析结果.txt

     文件       1694  2009-06-18 19:40  编译原理课程设计for循环\赋值语句分析过程.txt

     文件        524  2009-06-18 19:40  编译原理课程设计for循环\过程分析.txt

     目录          0  2009-06-19 12:11  编译原理课程设计for循环\Debug

     目录          0  2009-06-22 02:04  编译原理课程设计for循环

----------- ---------  ---------- -----  ----

              6023828                    21


评论

共有 条评论