📄 lexical.cpp
字号:
//invalid expression with no operator
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(parse_bool5(fp))
{
//Valid bool4
//production bool4::bool5
return(1);
}
//invalid
fseek(fp,fpos,SEEK_SET);
return(0);
}
int parse_bool5(FILE *fp)
{
char *token;
long fpos;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"!")==0)
{
if(parse_bool6(fp))
{
//Valid bool5
//production bool5:: ! bool6
safe_free(token);
return(1);
}
else
{
//invalid negation with no bool6 after
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
if(parse_bool6(fp))
{
//Valid bool5
//production bool5::bool6
return(1);
}
else
{
//invalid
return(0);
}
}
}
int parse_bool6(FILE *fp)
{
char *token;
long fpos;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"(")==0)
{
if(parse_logicexpr(fp))
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,")")==0)
{
//Valid bool6
//production bool6::(logicexpr)
safe_free(token);
return(1);
}
//invalid
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
//invalid
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
//invalid
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
int parse_expr(FILE *fp)
{
long fpos;
fpos = ftell(fp);
if(parse_term(fp))
{
if(parse_eprime(fp))
{
//Valid expr
//production expr::term eprime
return(1);
}
else
{
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
else
return(0);
}
int parse_eprime(FILE *fp)
{
char *token;
long fpos;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"+")==0)
{
if(parse_term(fp))
{
if(parse_eprime(fp))
{
//Valid eprime
//production eprime:: + term eprime
safe_free(token);
return(1);
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
if(strcmp(token,"-")==0)
{
if(parse_term(fp))
{
if(parse_eprime(fp))
{
//Valid eprime
//production eprime:: - term eprime
safe_free(token);
return(1);
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
//Valid eprime
//production eprime::e
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(1);
}
int parse_term(FILE *fp)
{
long fpos;
fpos = ftell(fp);
if(parse_fneg(fp))
{
if(parse_tprime(fp))
{
//Valid term
//production term::fneg tprime
return(1);
}
else
{
//pushback fneg
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
else
return(0);
}
int parse_tprime(FILE *fp)
{
char *token;
long fpos;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"*")==0)
{
if(parse_fneg(fp))
{
if(parse_tprime(fp))
{
//Valid tprime
//production tprime:: * fneg tprime
safe_free(token);
return(1);
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
if(strcmp(token,"/")==0)
{
if(parse_fneg(fp))
{
if(parse_tprime(fp))
{
//Valid tprime
//production tprime:: / fneg tprime
safe_free(token);
return(1);
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
else
{
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(0);
}
}
//Valid tprime
//production tprime::e
safe_free(token);
fseek(fp,fpos,SEEK_SET);
return(1);
}
int parse_fneg(FILE *fp)
{
long fpos;
char *token;
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
fpos = ftell(fp);
token = get_next_token(fp,token);
if(strcmp(token,"-")==0)
{
if(parse_factor(fp))
{
//Valid fneg production fneg:: -factor
safe_free(token);
return(1);
}
else
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
//pushback input
fseek(fp,fpos,SEEK_SET);
if(parse_factor(fp))
{
//Valid fneg production fneg::factor
safe_free(token);
return(1);
}
else
{
safe_free(token);
return(0);
}
}
}
int parse_factor(FILE *fp)
{
char *token;
long fpos;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"(")==0)
{
if(parse_expr(fp))
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,")")==0)
{
//Valid factor
//production factor::(expr)
safe_free(token);
return(1);
}
else
{
info_message("Missing close parenthesis in factor.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing expression after open parenthesis in factor.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
//pushback input
fseek(fp,fpos,SEEK_SET);
if(parse_fname(fp))
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,"(")==0)
{
if(parse_arglist(fp))
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,")")==0)
{
//Valid factor
//production factor::fname(arglist)
safe_free(token);
return(1);
}
else
{
info_message("Missing close parenthesis in function call.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Bad argument list in function call.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing open parenthesis after function name.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
//pushback input
fseek(fp,fpos,SEEK_SET);
safe_free(token);
if(parse_float(fp))
{
//production factor::float
return(1);
}
if(parse_integer(fp))
{
//production factor::integer
return(1);
}
if(parse_identifier(fp))
{
//production factor::identifier
return(1);
}
return(0);
}
int parse_string(FILE *fp)
{
char *token;
long fpos;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp, token);
if(strcmp(token,"\"")==0)
{
memset(token,'\0',strlen(token));
token[0] = (char)fgetc(fp);
//read input until closing quote is encountered
while(strcmp(token,"\"")!=0)
{
if(strcmp(token,"\\")==0)
{
//escape character coming so read it in
token[0] =(char)fgetc(fp);
}
if(feof(fp))
{
//Unclosed string
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
else
token[0] = (char)fgetc(fp);
}
//Valid string
safe_free(token);
return(1);
}
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
int parse_identifier(FILE *fp)
{
char *token;
long fpos;
char c;
fpos = ftell(fp);
//reject function names
if(parse_fname(fp))
return(0);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp, token);
//reject all keywords
if(strcmp(token,"begin")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"end")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"if")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"while")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"goto")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"label")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"int")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"float")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
if(strcmp(token,"string")==0)
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
//check for starting charater
if(strlen(token) > 0)
{
c = token[0];
if(isitalpha(c))
{
//valid identifier
safe_free(token);
return(1);
}
}
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
int parse_float(FILE *fp)
{
char *token;
long fpos;
fpos = ftell(fp);
if(parse_integer(fp))
{
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,".")==0)
{
if(parse_integer(fp))
{
//valid float
//production float::integer.integer
safe_free(token);
return(1);
}
}
fseek(fp,fpos,SEEK_SET);
safe_free(token);
}
return(0);
}
int parse_integer(FILE *fp)
{
char *token;
long fpos;
int i, valid;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
valid = 1;
for(i=0; i < (int)strlen(token);i++)
{
if(!(token[i] == '0' || token[i] == '1' || token[i] == '2' ||
token[i] == '3' || token[i] == '4' || token[i] == '5' ||
token[i] == '6' || token[i] == '7' || token[i] == '8' ||
token[i] == '9'))
valid = 0;
}
if(valid)
{
//valid integer
safe_free(token);
return(1);
}
else
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -