📄 morphology.h
字号:
//////////////////////////////////////
// 词法分析部分功能函数清单:
//
void GetChar();
//将下一输入字符读到ch中,搜索指示器前移一字符位置。
void GetBC();
//检查ch中的字符是否为空白。
//若是,则调用GetChar直至ch中进入一个非空格字符。
void Concat();
//将ch中的字符接到strToken之后
void Retract();
//将搜索指示器回调一个字符位置,设ch为空白字符。
int InsertId();
//将strToken中的标识符加入变量名表
int InsertConst();
//将strToken中的常量加入常量表
int Reserve();
//对strToken中的字符查保留字表,若它是一个保留字则返回它的编码,
//否则返回0,(假定0不是保留字的编码)。
int Reserve_Flag();
//对strToken中的字符查符号表,若它是一个符号则返回它的编码,
//否则返回0,(假定0不是符号的编码)。
void Get_A_Word(ofstream onfile);
//读入一个单词,并转换他的内码。
void GetChar()
{
ch=buff[I++];
}
void GetBC()
{
while(ch==32)
{
ch=buff[I];
I++;
}
}
void Concat()
{
char temp[2];
temp[0]=ch;
temp[1]='\0';
strcat(strToken,temp);
}
void Retract()
{
I--;
ch=32;
}
int Reserve()
{
//保留字表
for(int i=0;i<=lenth1-1;i++)
{
a_value[i]=i+1;
}
for(i=0;i<=lenth1-1;i++)
{
if(strcmp(strToken,a[i])==0) //如果两字符串相同,返回0
{
return a_value[i];
}
}
return 0;
}
char* Change(char *s)//小写变为大写
{
char p[1000]={'\0'};
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]>='A' && s[i]<'Z')
{
p[i]=s[i]+32;
}
else p[i]=s[i];
}
return p;
}
int Reserve_Flag()
{
//保留字表
char*p=0;
for(int i=0;i<=lenth2-1;i++)
{
d_value[i]=lenth1+1+i;
}
for(i=0;i<=lenth2-1;i++)
{ p=Change(strToken);
if(strcmp(strToken,d[i])==0)
{
return d_value[i];
}
}
return 0;
}
int InsertId()
{
for(int i=0;i<=J;i++)
{
if(strcmp(strToken,b[i])==0)
{
return b_value[i];
}
}
strcpy(b[J],strToken);
b_value[J]=BEGIN_OF_V+1+J;
J++;
return b_value[J-1];
}
///////////////////////////////////////////////////////
int InsertConst()
{
for(int i=0;i<=K;i++) {
if(strcmp(strToken,c[i])==0)
{
return c_value[i];
}
}
strcpy(c[K],strToken);
c_value[K]=BEGIN_OF_C+1+K;
K++;
return c_value[K-1];
}
void Get_A_Word(ofstream onfile)
{
int code;
int value;
strcpy(strToken,"");
GetChar();
GetBC();
if(isalpha(ch))//单词如果以字母开始
{
//cout<<"单词如果以字母开始"<<endl;
while(isalnum(ch)||isalpha(ch))
{
Concat();
GetChar();
}
Retract();
code=Reserve();
if(code==0)//则该单词不是保留字就是变量名
{
code=InsertId();
//cout<<"单词是变量"<<endl;
}
onfile<<code<<'\t';
onfile<<strToken<<endl;
onfile<<endl;
}
else
{
if(isalnum(ch))//单词如果以数字开始,则是常量
{
//cout<<"单词如果以数字开始"<<endl;
while(isalnum(ch))
{
Concat();
GetChar();
}
Retract();
code=InsertConst();
onfile<<code<<'\t';
onfile<<strToken<<endl;
onfile<<endl;
}
else//否则,则是符号或无效符号
{
//cout<<"单词如果不是以字母或数字开始"<<endl;
switch (ch)
{
case '+': Concat(); code=ADD; break;
case '-': Concat(); code=SUB; break;
case '*': Concat(); code=MUL; break;
case '/': Concat(); code=DIV; break;
case '=': Concat(); code=EQU; break;
case '.': Concat(); code=DOT; break;
case ',': Concat(); code=COM; break;
case ';': Concat(); code=SEM; break;
case '(': Concat(); code=LBR; break;
case ')': Concat(); code=RBR; break;
case '<':
Concat(); GetChar();
if (ch=='=')
{ Concat(); code=LEQ; }
else
{
if (ch=='>')
{ Concat(); code=NEQ; }
else
{ Retract(); code=LES; }
}
break;
case '>':
Concat(); GetChar();
if (ch=='=')
{ Concat(); code=LAG; }
else
{ Retract(); code=GEQ; }
break;
case ':':
Concat(); GetChar();
if (ch=='=')
{ Concat(); code=ASS; }
else
{ Retract(); code=COL; }
break;
}
onfile<<code<<'\t';
onfile<<strToken<<endl;
onfile<<endl;
if(code==0)
{
cout<<"无效字符!!"<<endl;
}
}
}
//字符串读函数 fgets(str,n,fp)
//从指定文件(fp)读入n-1 个字符,如果在读入n-1个字符之前遇到换行符或EOF(-1),
//读入即结束,结束后,在最后加上一个'\0'
//fgets函数返回str的地址
}
/////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -