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

📄 unit1.~cpp

📁 用BCB做的pascal词法分析器
💻 ~CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char comments[1000];
char * fp;
int m=1;    //用来定位StringGrid1的坐标
int n=1;    //用来定位StringGrid2的坐标
int i,c,k=1,j=1,u=0,d=1;

typedef struct //二元式的序列的结构体
{
 int clas;
 int valu;
 char name[32];
}trow;


typedef struct
{
 char name[100];
}error;

trow *table1[13];  //存放关键字的数组指针
trow *table2[50];  //存放标识符的中间过渡数组
trow *table4[50];
error *table3[50];  //存放标识符的数组

char character[32];//用来存放扫描字符的数组

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
StringGrid1->Cells[0][0]="class";
StringGrid1->Cells[1][0]="value";
StringGrid1->Cells[2][0]="keyword";
StringGrid2->Cells[0][0]="序列";
StringGrid2->Cells[1][0]="名字";
for(int i=0;i<13;i++)
{
 table1[i]=new trow;
}
table1[0]->clas=3; strcpy(table1[0]->name,"program");
table1[1]->clas=4; strcpy(table1[1]->name,"var");
table1[2]->clas=5; strcpy(table1[2]->name,"procedure");
table1[3]->clas=6; strcpy(table1[3]->name,"begin");
table1[4]->clas=7; strcpy(table1[4]->name,"end");
table1[5]->clas=8; strcpy(table1[5]->name,"if");
table1[6]->clas=9; strcpy(table1[6]->name,"then");
table1[7]->clas=10; strcpy(table1[7]->name,"else");
table1[8]->clas=11; strcpy(table1[8]->name,"while");
table1[9]->clas=12; strcpy(table1[9]->name,"do");
table1[10]->clas=13; strcpy(table1[10]->name,"call");
table1[11]->clas=14; strcpy(table1[11]->name,"integer");
table1[12]->clas=15; strcpy(table1[12]->name,"real");

for(int i=0;i<50;i++)
{
 table2[i]=new trow;
 table4[i]=new trow;
}
for(int i=0;i<50;i++)
{
 table3[i]=new error;
}
strcpy(table4[0]->name,"");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 TabSheet1->Show();
 Memo1->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

void print(int clas,int valu,char *character)          //输出table1里的内容
{
if(clas==1)
{
table2[j]->clas=clas;
table2[j]->valu=valu;
strcpy(table2[j]->name,character);
j++;
}
Form1->StringGrid1->Cells[0][m]=clas;
Form1->StringGrid1->Cells[1][m]=valu;
Form1->StringGrid1->Cells[2][m]=character;
m++;
}
//----------------------------------
int  scan_word(char * character)
{
 int v;
 for(v=1;v<=j;v++)
 {
 if(strcmp(character,table2[v]->name)==0)
 return v;
 }
 strcpy(table4[d]->name,character);d++;
 return 0;
}
//---------------------------------
int scan_key_word(char *character)        //查看是不是关键字  lookup
{
 c=0;
 for(int i=0;i<13;i++)
 {
 if(strcmp(table1[i]->name,character)==0)
 {
 c=table1[i]->clas;
 break;
 }
 }
 return c;
}
//----------------------------------
void scan()
{
char aa[10];
int i=0;
   c=0;
 while(*fp == ' ' ||*fp == '\n' ||*fp == '\t' || *fp== '\r')fp++;
    if(isalpha(*fp))                                   //第一个是否是字母
      {
         character[i++]=*fp;
         fp++;
         while(isalnum(*fp))
         {
         character[i++]=*fp;
         fp++;
         }
         character[i]='\0';
         c=scan_key_word(character);
         if(c==0)
         {
          int ab;
          ab=scan_word(character);
          if(ab!=0)print(1,ab,character);
          else   print(1,k++,character) ;
         }
         else print(c,0,character);
      }
      else if(isdigit(*fp))                            //是否是数字
           {
            character[i++]=*fp;
            fp++;
            while(isdigit(*fp))
            {
            character[i++]=*fp;
            fp++;
            }
            character[i]='\0';
            print(2,StrToInt(character),character);
           }
           else  switch(*fp)                              //是否是其它字符
                 {
                  case '+' : character[0]='+';character[1]='\0';fp++;
                             print(16,0,"+");break;
                  case '-' : character[0]='-';character[1]='\0';fp++;
                             print(17,0,"-");break;
                  case '*' : character[0]='*';character[1]='\0';fp++;
                             print(18,0,"*");break;
                  case '/' : character[0]='/';fp++;                        //显示注释
                             if(*fp=='/')
                             {
                              fp++;
                              while(isalnum(*fp)||*fp==' '){
                              character[i++]=*fp ;
                              fp++;
                              }
                              character[i]='\0';
                              strcpy(table3[u]->name,"注释 :(  ");
                              strcat(table3[u]->name,character);
                              strcat(table3[u]->name," ) ");
                              u++;
                              break;
                              }
                              else character[1]='\0';print(19,0,"/");
                              break;
                             print(19,0,"/");break;
                  case '~' : character[0]='~';character[1]='\0';fp++;
                             print(20,0,"~");break;
                  case '^' : character[0]='^';character[1]='\0';fp++;
                             print(21,0,"^");break;
                  case 'v' : character[0]='v';character[1]='\0';fp++;
                             print(22,0,"v");break;
                  case '<' : character[0]='<';fp++;
                             if(*fp=='='){character[1]='=';character[2]='\0';fp++;
                                print(24,0,character);
                                break;}
                             else {if(*fp=='>'){character[1]='>';character[2]='\0';fp++;
                                  print(28,0,character);}
                                  else {character[1]='\0';fp++;print(23,0,character);}
                                  }
                             break;
                  case '>' : character[0]='>';fp++;
                             if(*fp=='='){character[1]='=';character[2]='\0';fp++;
                                print(26,0,character);}
                             else {character[1]='\0';fp++;print(25,0,character);}
                             break;
                  case '=' : character[0]='=';character[1]='\0';fp++;
                             print(27,0,character);  break;
                  case ':' : character[0]=':';fp++;
                             if(*fp=='='){character[1]='=';character[2]='\0';fp++;
                                print(29,0,character);}
                             else { character[1]='\0';fp++;print(35,0,character);}
                             break;
                  case ';' : character[0]=';';character[1]='\0';fp++;
                             print(30,0,character);  break;
                  case '.' : character[0]='.';character[1]='\0';fp++;
                             print(31,0,character);  break;
                  case ',' : character[0]=',';character[1]='\0';fp++;
                             print(32,0,character);  break;
                  case '(' : character[0]='(';character[1]='\0';fp++;
                             print(33,0,character);  break;
                  case ')' : character[0]=')';character[1]='\0';fp++;
                             print(34,0,character);  break;
                  default  : character[0]=*fp;character[1]='\0';fp++;
                             strcpy(table3[u]->name,"有非法字符: ");
                             strcat(table3[u]->name,character);
                             u++;
                             break;

                 }


}
//----------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
strcpy(comments,Memo1->Lines->GetText());
fp=comments;
TabSheet2->Show();
while (*fp!='\0')
{
scan();
}
scan_word(character);
int t;
for(t=1;t<=d;t++)
{
Form1->StringGrid2->Cells[0][t]=t;
Form1->StringGrid2->Cells[1][t]=table4[t]->name;
}
for(int e=0;e<u;e++)
ListBox1->Items->Add(table3[e]->name);
}
//---------------------------------------------------------------------------







⌨️ 快捷键说明

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