⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ul.txt

📁 本课程设计即为词法分析阶段。词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序
💻 TXT
字号:
//--------------------------------------------------------------------------- 
 
#include <vcl.h> 
 
#include<iostream> 
#include <fstream> 
#pragma hdrstop 
 
#include "Unit1.h" 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
 
#define KEYWORDCOUNT 35 
#define SCOUNT 32 
#define FGCOUNT 8 
#define ZSCOUNT 1 
 
using namespace std; 
bool isrv=false; 
bool issd(const String *s1,const String &s2,int kcount); 
bool isfd(const char* s,const char m); 
 
//定义字母表 
char* crt="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLOMOPQRSTUVWXYZ_"; 
 
//定义数字 
char* numb="1234567890."; 
 
//定义符号 
char* syb="+-*/=~!#%&|<>,.\\"; 
 
//定义分隔符 
char* fgf="{}[]();"; 
 
//定义关键字 
String keyw[KEYWORDCOUNT]={"auto","break","case","char","const","continue","default","do","double", 
"else","enum","extern","float","for","goto","if","int","long","register", 
"return","short","signed","sizeof","static","struct","switch","typedef", 
"union","unsigned","void","volatile","while","true","false","bool"} ; 
 
//定义运算符 
String yuns[SCOUNT]={"->",".","!","++","--","&","~","*","/","%","+","-", 
"<<",">>","<","<=",">",">=","==","!=","&&","||", 
"=","+=","-=","*=","/=",",","#"}; 
 
 
 
//定义注释符 
String zs[ZSCOUNT]={"//"}; 
 
TForm1 *Form1; 
//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
: TForm(Owner) 
{ 
 
} 
//--------------------------------------------------------------------------- 
 
 
 
//TODO: ----------[ 判断一个字符是否在一个字符串内 ]-------------------- 
bool isfd(const char* s,const char m) 
{ 
    int i=strlen(s); 
 
    for(int jj=0;jj<=i-1;++jj) 
    { 
        if(m==s[jj])return true; 
    } 
    return false; 
} 
 
 
//TODO: ---------------[ 判断一个字符串是否在另一个字符串内 ]--------------- 
bool issd(const String *s1,const String &s2,int kcount) 
{ 
    for(int i=0;i<=kcount-1;++i) 
    { 
        if(s2==s1[i])return true; 
    } 
    return false; 
} 
 
 
//TODO: ----------------------[ 进行词法分析 ]------------------------- 
void __fastcall TForm1::Anylize1Click(TObject *Sender) 
{ 
    int ii; 
    char lin[1000]; 
    char num[10]; 
    char fh; 
    int j; 
    String final; 
    Result1->Checked=true; 
 
    for(int i=0;i<=RichEdit1->Lines->Count-1;++i) 
    { 
        j=1; 
        ii=-1; 
 
        char tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
 
 
 
        for(unsigned int iii=0;iii<=strlen(RichEdit1->Lines->Strings[i].c_str());++iii) 
        { 
 
 
            //状态1:"开头 
            if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='\"') 
            { 
                final+="(" +String(i+1) + ") "+"字符串开始标志:\""+String("\r\n"); 
                tk=RichEdit1->Lines->Strings[i].SubString(++j,1).c_str()[0]; 
                while(tk!='\n'&&tk!='\r'&&tk!='\0'&&tk!='\"') 
                { 
                    lin[++ii]=tk; 
                    ++j; 
 
                    tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
                    if(tk=='\"'){ 
                        lin[++ii]='\0'; 
                        // if(strlen(lin)>=4)lin[strlen(lin)-3]='\0'; 
                        final+="(" +String(i+1) + ")" +"字符串:"+String(lin)+String("\r\n"); 
                        final+="(" +String(i+1) + ") "+"字符串结束标志:\""+String("\r\n"); 
                        goto sends; 
                    } 
                } 
                if(strlen(lin)>=4)lin[strlen(lin)-3]='\0'; 
                final+="(" +String(i+1) + ")" +"字符串:"+String(lin)+String("\r\n"); 
                final+="(" +String(i+1) + ")"+"(" +String(j) + ") " +"错误:有字符串开始标志却无结束标志"+String("\r\n"); 
 
sends: 
 
 
                ++j; 
                ii=-1;     } 
            //---------------------------------------------------------------------- 
            //状态2://开头 
            else  if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='/'&&RichEdit1->Lines->Strings[i].SubString(j+1,1).c_str()[0]=='/') 
            { final+="(" +String(i+1) + ") "+"注释符://"+String("\r\n"); 
            tk=RichEdit1->Lines->Strings[i].SubString(j+2,1).c_str()[0]; 
            j+=2; 
            while(tk!='\n'&&tk!='\r'&&tk!='\0') 
            { 
                lin[++ii]=tk; 
                ++j; 
 
                tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
            } 
            lin[++ii]='\0'; 
            final+="(" +String(i+1) + ")" +"注释内容:"+String(lin)+String("\r\n"); 
 
 
 
            ii=-1;     } 
 
            //------------------------------------------------------------- 
                        //状态2:#开头 
            else  if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='#') 
            { final+="(" +String(i+1) + ") "+"预定义符:#"+String("\r\n"); 
            tk=RichEdit1->Lines->Strings[i].SubString(j+1,1).c_str()[0]; 
            j+=1; 
            while(tk!='\n'&&tk!='\r'&&tk!='\0') 
            { 
                lin[++ii]=tk; 
                ++j; 
 
                tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
            } 
            lin[++ii]='\0'; 
            final+="(" +String(i+1) + ")" +"预定义内容:"+String(lin)+String("\r\n"); 
 
 
 
            ii=-1;     } 
 
            //------------------------------------------------------------- 
            //状态3:'开头 
 
            else if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='\'') 
            { 
                final+="(" +String(i+1) + ") "+"字符开始标志:\'"+String("\r\n"); 
                tk=RichEdit1->Lines->Strings[i].SubString(++j,1).c_str()[0]; 
                while(tk!='\n'&&tk!='\r'&&tk!='\0'&&tk!='\'') 
                { 
                    lin[++ii]=tk; 
                    ++j; 
 
                    tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
                    if(tk=='\''){ 
                        lin[++ii]='\0'; 
                        // if(strlen(lin)>=4)lin[strlen(lin)-3]='\0'; 
                        final+="(" +String(i+1) + ")" +"字符:"+String(lin)+String("\r\n"); 
                        final+="(" +String(i+1) + ") "+"字符结束标志:\'"+String("\r\n"); 
                                                if(strlen(lin)>1)final+="(" +String(i+1) + ") "+"(" +String(j) + ") "+"字符长度大于1,是否是字符串?"+String("\r\n"); 
                        goto sends2; 
                    } 
                } 
                if(strlen(lin)>=4)lin[strlen(lin)-3]='\0'; 
                final+="(" +String(i+1) + ")" +"字符串:"+String(lin)+String("\r\n"); 
                final+="(" +String(i+1) + ")"+"(" +String(j) + ") " +"错误:有字符串开始标志却无结束标志"+String("\r\n"); 
 
sends2: 
 
 
                ++j; 
                ii=-1;     } 
 
 
            //状态3:字母开头 
            else if(isfd(crt,tk)) 
            { 
                while(isfd(crt,tk)||isfd(numb,tk)) 
                { 
                    lin[++ii]=tk; 
                    ++j; 
                    tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
                } 
                lin[++ii]='\0'; 
 
                //是否关键字 
                if(issd(keyw,lin,KEYWORDCOUNT)) 
                    final+="(" +String(i+1) + ") "+"关键字:"+String(lin)+String("\r\n"); 
                else 
                    final+="(" +String(i+1) + ") "+"自定义标识符:"+String(lin)+String("\r\n"); 
 
                ii=-1; 
            } 
 
            //状态4:符号开头 
            else if(isfd(syb,tk)) 
            { 
                while(isfd(syb,tk)) 
                { 
                    lin[++ii]=tk; 
                    ++j; 
                    tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
                } 
                lin[++ii]='\0'; 
 
                //是否运算符 
                if(issd(yuns,lin,SCOUNT)) 
                    final+="(" +String(i+1) + ") "+"运算符:"+String(lin)+String("\r\n"); 
                else 
                    final+="(" +String(i+1) + ")"+"(" +String(j) + ") "+"错误符号:"+String(lin)+String("\r\n"); 
                ii=-1; 
 
 
            } 
 
            //状态5:数字开头 
            else if(isfd(numb,tk)) 
            { 
                while(isfd(numb,tk)) 
                { 
                    lin[++ii]=tk; 
                    ++j; 
                    tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
                } 
                lin[++ii]='\0'; 
                final+="(" +String(i+1) + ") "+"数字:"+String(lin)+String("\r\n"); 
                ii=-1; 
            } 
 
            //状态6:分隔符开头 
 
            else if(isfd(fgf,tk)) 
            { 
 
 
                lin[++ii]=tk; 
                ++j; 
                tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
 
                lin[++ii]='\0'; 
                final+="(" +String(i+1) + ") "+"分隔符:"+String(lin)+String("\r\n"); 
                ii=-1; 
            } 
 
 
            //以上什么都不是,跳过 
            else 
            { 
                ++j; 
                tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]; 
            } 
 
 
 
        } 
 
    } 
    Memo1->Text=final; 
    isrv=true; 
    RichEdit1->Width=Form1->Width-Memo1->Width-8; 
 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -