📄 lexcial.cpp
字号:
wordget[i++] = ch;
GetChar();
}while(ch != '"' && ch != '\0');
wordget[i++] = ch; wordget[i] = '\0';
if(ch == '\0')
{
printf("%s",wordget);
ProcError(3);
pDu->kind = ERROR;
pDu->value = 0;
}
else
{
value = InsertConst(wordget);
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);
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("源代码读入\n");
//将源程序读入缓冲区
if ((fin=fopen("Test.c","r")) == NULL)
{
printf("Cannot open infile\n");
return 0;
}
i = 0;
while((c = fgetc(fin)) != EOF)
{
if(i >= PRO_MAX_LEN-1)
{
printf("\n程序代码太长,无法处理\a");
return 0;
}
proBuffer[i++] = c;
}
fclose(fin); //关闭文件
proBuffer[i++] = '\0';
printf("\n***************************\n源代码读入成功,源代码如下:\n%s",proBuffer);
printf("\n按任意键继续\n"); getch();
//预处理
printf("\n预处理\n");
pretreatment();
printf("\n***************************\n预处理成功,去掉注释后的源代码为:\n%s*",proBuffer);
printf("\n按任意键继续\n"); getch();
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"); getch();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -