📄 wordcompile.h
字号:
case 2070: switch(chin)
{
case 'l':State=2071;break;
default:if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_')) State=5000;
else State=5500; break;
}
break;
case 2071: switch(chin)
{
case 's':State=2072;break;
default: if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_')) State=5000;
else State=5500; break;
}
break;
case 2072: switch(chin)
{
case 'e':State=8888;break; //"false"
default: if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_')) State=5000;
else State=5500; break;
}
break;
case 3000: switch(chin) //数字的输入
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':State=3000;break;
case '.':State=3001;break;
default: if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_'))
{ //字符是无效的
/*
提示错误信息:illegal variant
*/
CatchErrors(7);
return -1;
}
else {
State=2000; //字符是有效的
return 1;
}
}
break;
case 3001: switch(chin) //输入小数点以后的状态
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':State=3001;break;
default: State=2000;return 1; //
}
break;
case 4001: //冒号的输入
switch(chin) //":"
{
case '=': State=2000;
//用字符"="覆盖字符":"
default:
break;
}
return 1;
break;
case 4100:
State=2000;
switch(chin)
{
case '=':break; //"<="
case '>':break; //"<>"
default: return 1;
}
break;
case 4101:
State=2000;
switch(chin)
{
case '=':break; //">="
default: break;
}
break;
case 5000: //此状态为正在输入变量的状态
if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_'))
State=5000;
else
State=5500;
break;
case 5500: //将此栈中的单词与单词表中的词相比较,如果匹配则是合法的,否则报出错误
break;
case 5080: //此刻已在等待输入一个变量
case 5081: //此刻正在等待输入程序名
case 5082: //此刻正在等待输入程序名
case 5083: //此刻正在等待输入程序名
//cout<<wordLength<<endl;
if(
((chin>='0')&&(chin<='9')&&(wordLength>=0)&&(TempWord[0]!=' ')&&(TempWord[0]!='\n'))
or //数字不能作为标识符的头
((chin>='a')&&(chin<='z'))
or
(chin=='_')
) //如果输入的是字符,就继续
{}
else
{
if(
(wordLength<0)
||
(
(wordLength==0)&&
((TempWord[0]==' ')||(TempWord[0]=='\n'))
)
)
//即目前为止没有收到变量信息
{
if((chin==' ')||(chin=='\n')) //将所有空格和回车去掉
{
//cout<<"kong"<<endl;
//cout<<TempWord<<endl;
return 1; //将空字符输出
}
else
{
//cout<<"wrong"<<endl;
//如果是其他字符,则显示错误信息
CatchErrors(State-5078);
State=2000;
}
}
else //说明此变量已经输入完毕,则记录到变量表中
{
TempWord[wordLength+1]='\0';
while(TempWord[0]==' ') //左边的空格
{
for(int i=0;i<=wordLength;i++)
TempWord[i]=TempWord[i+1];
wordLength--;
}
while(TempWord[wordLength]==' ')//消除右边的空格
TempWord[wordLength--]='\0';
//cout<<TempWord<<endl;
//首先要判断这个变量以前是否声明过
int flag=1; //临时的标志变量
int temp;
switch(State)
{
case 5080:temp=100;break;
case 5081:temp=900;break;
case 5082:temp=800;break;
case 5083:temp=700;break;
default:break;
}
/*
for(int i=1;i<VariantCount;i++)
if(strcmp(TempWord,Variant[i])==0)
if(temp+Phase==VariantType[i]) //类型和名称同时相同,说明重复定义
{flag=0;break;}
*/
if(flag==0)
{
// 输出错误信息:变量重复定义
State=2000;
CatchErrors(6);
}
else
{
switch(State) //将此变量记录到变量表文件里
{
case 5080: //变量名
fwordtable<<"100 ";
VariantType[VariantCount]=100;
//记录变量是程序名、函数名还是过程名
break;
case 5081: //程序名
fwordtable<<900+Phase<<" ";
VariantType[VariantCount]=900+Phase;
break;
case 5082: //过程名
fwordtable<<800+Phase<<" ";
VariantType[VariantCount]=800+Phase;
break;
case 5083: //函数名
fwordtable<<700+Phase<<" ";
VariantType[VariantCount]=700+Phase;
break;
}
fwordtable<<TempWord<<endl;
//还需要记录在自身类的数组里,以便查询
strcpy(Variant[VariantCount],TempWord);
VariantCount++;
//再在生成文件上记录
TempWord[0]='i';TempWord[1]='d';TempWord[2]='\0';
wordLength=2;
//考虑这以后状态转移的问题
if((chin==',')||(chin=='(')) //如果是逗号或左括号则继续向下分析
{
if(chin=='(') Phase=10;
State+=100; //状态分别变成5180,5181,5182,5183
}
else if(chin==' ')
{
}
else
State=2000; //如果是其他则恢复到正常状态
return 1; //将ID输出到目标文件
}
}
}
break;
case 5180: //此刻已在等待输入另一个变量
case 5181: //此刻正在等待输入另一个程序名
case 5182: //此刻正在等待输入另一个过程名
case 5183: //此刻正在等待输入另一个函数名
if((TempWord[0]==',')||(TempWord[0]=='('))
{
State-=100;
return 1;
}
break;
case 8880: //var刚输入完成
case 8881: //Program输入完成
case 8882: //Procedure输入完成
case 8883: //Function输入完成
//判断是否为关键字的结尾
if(
((chin>='0')&&(chin<='9'))
or
((chin>='a')&&(chin<='z'))
or
(chin=='_')
) //如果这还不是结尾,则把它定义成变量
{
State=5000;
}
else
{
State-=3800; //完成了一个标识符的输入
//它们各自转到自己的对应状态
Phase=0; //分别为 5080 5081 5082 5083
return 1;
}
//首先确认此变量不是参数
break;
case 8888: //判断是否为关键字的结尾
if(((chin>='0')&&(chin<='9'))or((chin>='a')&&(chin<='z'))or(chin=='_')) //如果这还不是结尾,则把它定义成变量
{
State=5000;
}
else
{
State=2000; //完成了一个标识符的输入
return 1;
}
break;
default: break;
}
if(State==5500) //如果状态是5500,则需要马上进行处理,判断此标识符是否已经声明
{
//首先将此单词进行改造
//单词比较之前,一定要进行去除空格的工作
TempWord[wordLength+1]='\0';
while(TempWord
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -