📄 词法分析.cpp
字号:
#include <stdio.h>
#include<string.h>
#include<ctype.h>
#define BUFFMAXLEN 100
FILE *out;
char token[20],s[20],filename[25],outfile[25],ch;
char blank[33][10]={"auto","break","case","char","const","continue","default",
"do","double","else","enum","extern","float","for","goto",
"if","int","long","register","return","short","signed","sizeof",
"static","struct","switch","typedef","union","unsigned",
"void","volatile","while"};
void getbe()
{
int readchar(char *ch);
while(isspace(ch))
ch=readchar(filename);
}
void concatenation(char ch)
{
strcat(token,&ch);
}
void error()
{
if(ch!=-1)
fputs("\nyour input a data ERROR!",out);
}
int reserve()
{
int i,m=0;
for(i=0;i<=31;i++)
{
if(strcmp(token,blank[i])==0)m=1;
}return(m);
}
int readchar(char * filename)
{
static FILE *fp = NULL;
static char buff[BUFFMAXLEN];
static int bufflen = 0;
static int buffpos = -1;
if (fp == NULL)
{
if ((fp = fopen(filename,"r")) == NULL)
{
printf("File open error!\n");
return 0;
}
}
if (buffpos == -1)
{
if (feof(fp))
{
fclose(fp);
return -1;
}
bufflen = fread(buff,sizeof(char),BUFFMAXLEN,fp);
buffpos = 0;
}
if (buffpos < bufflen)
ch = buff[buffpos++];
if (buffpos >= bufflen)
buffpos = -1;
return ch;
}
void main() //主函数
{
int c,k=0;
char b=' ';
printf("\nPlease input filename:");
scanf("%s",filename);
printf("\nPlease input outfile name:");
scanf("%s",outfile);
if((out=fopen(outfile,"w+"))==NULL)
{
printf("\ncannot open outfile file!");
}
ch=b;
while(ch!=-1&&ch!=0)
{
strcpy(token,s);
if(k==0)
ch=readchar(filename);
else
{
ch=b;
k=0;
}
getbe();
if(isalpha(ch))
{
while(isalnum(ch))
{
concatenation(ch);
b=ch=readchar(filename);k=1;
}
c=reserve();
if(c==1)
fprintf(out,"\n< %s ,_ >",token);
else
fprintf(out,"\n< ident ,\"%s\" >",token);
}
else
{
if(isdigit(ch))
{
while(isdigit(ch))
{
concatenation(ch);
b=ch=readchar(filename);
k=1;
}
fprintf(out,"\n< const ,%s >",token);
}
else
switch(ch)
{
case '+':
b=ch=readchar(filename);
if(ch=='+')fputs("\n< ++ , _>",out);
else
{
fputs("\n< + ,_ >",out);
k=1;
}
break;
case '-':
b=ch=readchar(filename);
if(ch=='-')fputs("\n< -- , EQ>",out);
else
{
fputs("\n< - ,_ >",out);
k=1;
}
break;
case '*':
fputs("\n< * ,null >",out);
break;
case '<':
b=ch=readchar(filename);
if(ch=='=')fputs("\n< <= , LE>",out);
else
{
fputs("\n< < ,LT >",out);
k=1;
}
break;
case '=':
b=ch=readchar(filename);
if(ch=='=')
fputs("\n< == , EQ>",out);
else
{
fputs("\n< = ,_ >",out);
k=1;
}
break;
case '>':
b=ch=readchar(filename);
if(ch=='=')
fputs("\n< >= ,RE >",out);
else
{
fputs("\n< > ,RT >",out);
k=1;
}
case '&':
b=ch=readchar(filename);
if(ch=='&')
fputs("\n< && , _>",out);
else
{
fputs("\n< & ,_ >",out);
k=1;
}
break;
case '|':
b=ch=readchar(filename);
if(ch=='|')
fputs("\n< ||, _>",out);
else
{
fputs("\n< | ,_ >",out);
k=1;
}
break;
case '!': b=ch=readchar(filename);
if(ch=='=')fputs("\n< != , _>",out);
else {fputs("\n< ! ,_ >",out);k=1;}
break;
case ':': fputs("\n< : ,_ >",out);break;
case ',': fputs("\n< , ,_ >",out);break;
case ';': fputs("\n< ; ,_ >",out);break;
case '(': fputs("\n< ( ,_ >",out);break;
case ')': fputs("\n< ) ,_ >",out);break;
case '{': fputs("\n< { ,_ >",out);break;
case '}': fputs("\n< } ,_ >",out);break;
case '[': fputs("\n< [ ,_ >",out);break;
case ']': fputs("\n< ] ,_ >",out);break;
case '"': fputs("\n< \",_ >",out);break;
case '#': fputs("\n< # ,_ >",out);break;
case '\\': fputs("\n< \\ ,_ >",out);break;
case '%': fputs("\n< % ,_ >",out);break;
case '.': fputs("\n< . ,_ >",out);break;
case '\'': fputs("\n< ' ,_ >",out);break;
case '?': fputs("\n< ? ,_ >",out);break;
case '^': fputs("\n< ^ ,_ >",out);break;
default:
error();
}
}
}
fclose(out);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -