• 大小: 509KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2022-04-21
  • 语言: 其他
  • 标签: 词法分析  

资源简介

编译原理课程设计,包括词法分析,语法分析,语义代码生成等。

资源截图

代码片段和文件信息

#include 
#include    
#include    
#include
#include //用于int 转 string
#include
#include
#include  
using namespace std;

/******************************** 词法分析程序********************************/
char *verse[14]={“int““char““float““void““const““for““if““else““then“
 “while““switch““break““begin““end“};  //保留字(关键字表)
char flagd[9]={‘+‘‘-‘‘*‘‘/‘‘%‘‘<‘‘>‘‘!‘‘=‘};   // 需要检查后面是否出现‘=’
char flags[10]={‘}‘‘{‘‘[‘‘]‘‘(‘‘)‘‘‘‘;‘‘:‘‘“‘}; //  ‘||’ 与‘&&’ 单独判断(对各种符号的判断--包括标点符号)
bool isFlagd(char c)//需要二次判断的界符
{
for(int i=0;i<9;i++)
{
if(flagd[i]==c)
return true;
    
}
return false;
}
bool isFlags(char c)//需要一次判断即可确定的界符
{
for(int i=0;i<10;i++)
{
if(flags[i]==c)
return true;
}
 return false;
}
bool isDigital(char ch)   //判断是否为数字
{
if(ch<=‘9‘ && ch >=‘0‘)
return true;
else
return false;
}
bool isAlphabet(char ch)//判断是否是字母
{
if(ch<=‘Z‘ && ch >=‘A‘ || ch<=‘z‘ && ch>=‘a‘)
return true;
else
return false;
}
bool isSpace(char ch) //判断是否为空白符(空格、回车、制表符等)是则返回true,否则返回false 
{
if(ch==‘ ‘|| ch==‘\r‘ || ch==‘\t‘) 
return true; 
    else
return false; 

void getCh(fstream *fpchar *ch) /*读取字符送ch*/ 
{    
(*fp).read(chsizeof(char)); 

void getC(fstream *fpchar *ch) /*如果是空白则继续读下一个,直到不是空白*/ 
{                       
do 
{
getCh(fpch);
}while(isSpace(*ch)&&(*ch != EOF)); 
} //即忽略空白符
bool isReverse(string str) //是否为关键字
{
for(int i=0;i<14;i++)
{
if(verse[i] ==str)
return true;
}
return false;
}
void reTract(fstream *fpchar *ch) /*光标回退一位并使 ch 为空*/
{
(*fp).seekg(-1ios::cur); 
*ch = ‘ ‘; 


typedef struct vess  //定义结构:二元式表(单词,内码值)
{
string v;    // 单词
string  code;  // 内码值
}ves;

typedef struct charSet //符号表结构体定义
{
int num;//标示符在符号表中的位置
string name;
string type;
}chSet;

typedef struct varConst //常量表结构体定义
{
int num;
string value;
}varCon;

int isExisted(list Lstring  str)
//判断符号表的链表中是否已经存在str存在返回入口地址,即 L.num,否则返回-1;
{
list::iterator Iter;
for (Iter = L.begin();Iter!= L.end( );Iter++)  
{
if((*Iter).name==str)
return (*Iter).num;
}
return -1;
}
int isExisted(list Lstring  str) 
//判断常量表的链表中是否已经存在str存在返回入口地址,即 L.num,否则返回-1;
{
list::iterator Iter;
for (Iter = L.begin();Iter!= L.end( );Iter++)  
if((*Iter).value==str)
return (*Iter).num;
return -1;
}
void function_word(list *revlist *identifierlist *constent)//词法分析函数 
{
char ch;
    string buffer=““;  
ves r;         //二元式结构体
chSet id;     //标示符结构体
varCon con;  //常量结构体
char filename[30];  
fstream f;
    int n=0;     //记录程序行数
stack s;  //保存行数
cout<<“请您输入文件路径:“< cin>>filename;
f.open(filenameios::in|ios::binary);
if(!f)
{
cout<<“File could not be open!“< exit(0);
//abort();
}
f.seekg(0ios::end);    //将指针移动到文件末尾
long 

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

     文件      19266  2010-06-15 20:39  编译原理 杨敬宗--B07523--11号\Compiling.cpp

     文件     338378  2010-06-15 20:21  编译原理 杨敬宗--B07523--11号\编译原理.pptx

     文件     201771  2010-06-24 22:04  编译原理 杨敬宗--B07523--11号\课程设计报告--终结版.docx

     目录          0  2010-11-22 22:31  编译原理 杨敬宗--B07523--11号

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

               559415                    4


评论

共有 条评论