📄 合作.cpp
字号:
else
{
value = InsertConst(wordget); //将str串以常数插入符号表,并返回常数表指针
pDu->kind = CONST;
pDu->value = value;
}
return true;
//字符常量
case '\'':
wordget[i++] = ch; // '
GetChar(); //获得一个字符不包括结束标记
wordget[i++] = ch;
if(ch == '\\') // '\n'
{//如果是转义字符则要多接收一个字符
GetChar(); // ch = '
wordget[i++] = ch;
}
GetChar();
wordget[i++] = ch;
wordget[i] = '\0';
if(ch != '\'')
{//'\b'
printf("%s",wordget);
ProcError(2);
pDu->kind = ERROR;
pDu->value = 0;
}
else
{
value = InsertConst(wordget);//将str串以常数插入符号表,并返回常数表指针
pDu->kind = CONST;
pDu->value = value;
}
return true;
case '(':
case ')':
case '[':
case ']':
case '.':
case ',':
case '~':
case '?':
case ':':
case ';':
case '{':
case '}':
case '#':
wordget[i++] = ch; wordget[i] = '\0';
pDu->kind = DIVIDE; //界符
pDu->value = -1;
return true;
case '!':
//!=
wordget[i++] = ch;
GetChar();//获得一个字符不包括结束标记
if (ch=='=') wordget[i++] = ch;
else Retract(); //将搜索指示器回调一个字符位置
wordget[i]='\0';
break;
case '<':
// << <=
wordget[i++] = ch;
GetChar();
if (ch == '<' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '>':
// >> >=
wordget[i++] = ch;
GetChar();
if (ch == '>' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '=':
// ==
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '&':
// && &=
wordget[i++] = ch;
GetChar();
if (ch == '&' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '|':
// || |=
wordget[i++] = ch;
GetChar();
if (ch == '|' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '+':
// ++ +=
wordget[i++] = ch;
GetChar();
if (ch == '+' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '-':
// -- -= ->
wordget[i++] = ch;
GetChar();
if (ch == '-' || ch == '=' || ch == '>') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '*':
// ** *=
wordget[i++] = ch;
GetChar();
if (ch == '*' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '/':
// /=
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '%':
// %=
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '^':
// ^=
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '\0':
return false;
default:
ProcError(1);
return false;
}
pDu->kind = OPERAT;
return true;
}
int main()
{
Dualistic tmp;
pDualistic ptmp = &tmp;
FILE *fin, *fout;
int i;
char c;
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");
printf("\t\t★ ★\n");
printf("\t\t★ 词法分析器 ★\n");
printf("\t\t★ ★ \n");
printf("\t\t★ 班级: 计算计05-3班 ★ \n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n\n");
printf("\t\t \n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");
printf("\t\t★ ★ \n");
printf("\t\t★ 杨倩 学号: 0504030338 ★\n");
printf("\t\t★ 张文明 学号: 0504030446 ★\n");
printf("\t\t★ ★\n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n\n");
printf("\n\n ***************************\n");
printf(" \t\t\t 读入要分析的词法\n");
//将源程序读入缓冲区
if ((fin=fopen("Test.c","r")) == NULL)
{
printf("Cannot open infile\n");
return 0;
}
i = 0;
while((c = fgetc(fin)) != EOF)//fgetc文件中所有的数据(包括'\0')都是一样处理,除非读到了末尾,它就返回一个特殊值EOF
{
if(i >= PRO_MAX_LEN-1) // PRO_MAX_LEN 源程序最大长度
{
printf("\n程序代码太长,无法处理\a");
return 0;
}
proBuffer[i++] = c;
}
fclose(fin); //关闭文件
proBuffer[i++] = '\0';
printf("\t\t ***************************\n词法读入成功,如下所示:\n%s",proBuffer);
printf("\n请按任意键继续\n"); getch();
//预处理
printf("\n*****************************\n");
printf("\n 预处理\n");
pretreatment();//预处理函数
printf("\n*****************************\n预处理成功,去掉注释后的词法为:\n%s*",proBuffer);
printf("\n请按任意键继续\n");
getch();// 所谓的按任意键继续
printf("\n*****************************\n");
printf("\n 词法分析\n");
printf("\n*****************************\n");
point = 0;
//词法分析
if ((fout=fopen("Result.txt","wb")) == NULL)
{
printf("建立文件Result.txt失败。\n");
return 0;
}
i = 0;
errorLine = 0; //错误行归零
do
{
if(i++ > PRO_MAX_LEN)//防止遇到BUG 导致程序死循环无限写文件
break;
if(!wordAnalyse(ptmp))
{
break;
}
if (ptmp->value == -1)
fprintf(fout, "<%3d, ->\t",ptmp->kind);
else
fprintf(fout, "<%3d,%3d>\t",ptmp->kind, ptmp->value);
switch(ptmp->kind)
{
case ERROR:
fprintf(fout, "(出 错:%s)",wordget);
break;
case ID:
fprintf(fout, "(标识符:%s)",wordget);
break;
case CONST:
fprintf(fout, "(常 量:%s)",wordget);
break;
case OPERAT:
fprintf(fout, "(运算符:%s)",wordget);
break;
case DIVIDE:
fprintf(fout, "(界 符:%s)",wordget);
break;
default:;
}
if(ptmp->kind >= 1 && ptmp->kind <= KEYWORD_LEN)
fprintf(fout, "(关键字:%s)",kwTab[ptmp->kind-1]);
fprintf(fout, "\r\n");
}while(1);
fclose(fout);
printf(" 结果写入常量表和标识符表\n");
//常量表
if ((fout=fopen("Const.txt","wb")) == NULL)
{
printf("建立文件Const.txt失败。\n");
return 0;
}
for(i = 0; i < pointCTB; ++i)
fprintf(fout, "%3d %s\r\n",i, constTab[i]);
fclose(fout);
//标识符表
if ((fout=fopen("Sign.txt","wb")) == NULL)
{
printf("建立文件Sign.txt失败。\n");
return 0;
}
for(i = 0; i < pointSTB; ++i)
fprintf(fout, "%3d %s\r\n",i, signTab[i]);
fclose(fout);
printf("\n 结果写入完毕!\n\n请按任意键继续\n"); getch();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -