📄 unit1.~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 + -