囧,编译原理大作业,正好最近要写LRC歌词解析,貌似要用到LEX语法分析,顺便复习一下。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 255 // 字符串缓冲;亦是关键字、标识符、注释的最大有效长度
bool IsNumber(char CurrentChar);
bool IsUpperLetter(char CurrentChar);
bool IsLowerLetter(char CurrentChar);
bool IsVerifiedSymbol(char CurrentChar);
char CheckNonsignificantChar(FILE* in, char CurrentChar);
bool IsKeywords(char Word[]);
bool IsSingleSymbol(char CurrentChar);
void IsDoubleSymbol(FILE* in, FILE* out, char CurrentChar, char FirstChar, char SecondChar);
int main()
{
FILE *in, *out;
char arr[MAX];
char CurrentChar=' ';
int i=0;
if(!(in=fopen("input.txt","r")))
{
printf("Cannot Open Input File(input.txt).\n");
system("pause");
return 0;
}
if(!(out=fopen("output.txt","w")))
{
printf("Cannot Open Output File(output.txt).\n");
system("pause");
return 0;
}
while(CurrentChar!=-1)
{
CurrentChar=fgetc(in);
if(IsNumber(CurrentChar)||IsUpperLetter(CurrentChar)||IsLowerLetter(CurrentChar)||IsVerifiedSymbol(CurrentChar))
{
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
i=0;
if(IsNumber(CurrentChar))
{
arr[i++]=CurrentChar;
CurrentChar=fgetc(in);
while(IsNumber(CurrentChar))
{
arr[i++]=CurrentChar;
CurrentChar=fgetc(in);
}
fseek(in,-1,SEEK_CUR);
arr[i++]='\0';
fprintf(out,"%s%s\n","Number : ",arr);
continue;
}
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
i=0;
if(IsLowerLetter(CurrentChar)||IsUpperLetter(CurrentChar))
{
while(IsLowerLetter(CurrentChar)||IsUpperLetter(CurrentChar)||IsNumber(CurrentChar))
{
arr[i++]=CurrentChar;
CurrentChar=fgetc(in);
}
fseek(in,-1,SEEK_CUR);
arr[i++]='\0';
if(IsKeywords(arr))
fprintf(out,"%s%s\n","Keyword : ",arr);
else
fprintf(out,"%s%s\n","Identifier: ",arr);
continue;
}
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
if(IsSingleSymbol(CurrentChar))
{
fprintf(out,"%s%c\n","Symbol : ",CurrentChar);
}
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
IsDoubleSymbol(in, out, CurrentChar, '=', '=');
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
IsDoubleSymbol(in, out, CurrentChar, '>', '=');
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
IsDoubleSymbol(in, out, CurrentChar, '<', '=');
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
IsDoubleSymbol(in, out, CurrentChar, '!', '=');
CurrentChar=CheckNonsignificantChar(in, CurrentChar);
i=0;
if(CurrentChar=='/')
{
arr[i++]=CurrentChar;
CurrentChar=fgetc(in);
if(CurrentChar=='*')
{
do
{
arr[i++]=CurrentChar;
CurrentChar=fgetc(in);
} while (!(CurrentChar=='*'&&fgetc(in)=='/'));
arr[i++]='*';
arr[i++]='/';
arr[i++]='\0';
fprintf(out,"%s%s\n","Annotation: ",arr);
}
else
{
fseek(in,-1,SEEK_CUR);
fprintf(out,"%s%c\n","Symbol : ",'/');
}
}
}
else
{
fprintf(out,"%s%c\n","error : ",CurrentChar);
CurrentChar=fgetc(in);
}
}
fclose(in);
fclose(out);
return 0;
}
bool IsNumber(char CurrentChar)
{
if(CurrentChar>='0'&&CurrentChar<='9')
return true;
else
return false;
}
bool IsUpperLetter(char CurrentChar)
{
if(CurrentChar>='A'&&CurrentChar<='Z')
return true;
else
return false;
}
bool IsLowerLetter(char CurrentChar)
{
if(CurrentChar>='a'&&CurrentChar<='z')
return true;
else
return false;
}
bool IsVerifiedSymbol(char CurrentChar)
{
if(CurrentChar=='+'||
CurrentChar=='-'||
CurrentChar=='*'||
CurrentChar=='/'||
CurrentChar=='<'||
CurrentChar=='>'||
CurrentChar=='='||
CurrentChar=='!'||
CurrentChar==';'||
CurrentChar==','||
CurrentChar=='('||
CurrentChar==')'||
CurrentChar=='['||
CurrentChar==']'||
CurrentChar=='{'||
CurrentChar=='}'||
CurrentChar==' '||
CurrentChar=='\t'||
CurrentChar=='\n')
return true;
else
return false;
}
char CheckNonsignificantChar(FILE* in, char CurrentChar)
{
while(CurrentChar==' '||CurrentChar=='\t'||CurrentChar=='\n')
{
CurrentChar=fgetc(in);
}
return CurrentChar;
}
bool IsKeywords(char Word[])
{
if(!strcmp(Word,"else")||
!strcmp(Word,"if")||
!strcmp(Word,"int")||
!strcmp(Word,"return")||
!strcmp(Word,"void")||
!strcmp(Word,"while"))
return true;
else
return false;
}
bool IsSingleSymbol(char CurrentChar)
{
if(CurrentChar=='+'||
CurrentChar=='-'||
CurrentChar=='*'||
CurrentChar==';'||
CurrentChar==','||
CurrentChar=='('||
CurrentChar==')'||
CurrentChar=='['||
CurrentChar==']'||
CurrentChar=='{'||
CurrentChar=='}')
return true;
else
return false;
}
void IsDoubleSymbol(FILE* in, FILE* out, char CurrentChar, char FirstChar, char SecondChar)
{
if(CurrentChar==FirstChar)
{
if(fgetc(in)==SecondChar)
{
fprintf(out,"%s%c%c\n","Symbol : ",FirstChar,SecondChar);
}
else
{
fseek(in,-1,SEEK_CUR);
if(FirstChar=='!')
{
fprintf(out,"%s%c\n","ErrorChar : ",CurrentChar);
}
else
{
fprintf(out,"%s%c\n","Symbol : ",FirstChar);
}
}
}
}
近期评论