📄 lexical.cpp
字号:
{
return(0);
}
}
int parse_statement(FILE *fp)
{
char *token;
long fpos;
long fpos2;
int temp_index;
int jump;
//set original file position
fpos = ftell(fp);
//look for declaration
if(parse_declaration(fp))
return(1);
//look for function call
if(parse_fname(fp))
{
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
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 functioncall statement found
insert_statement_record(&statement_table, statement_index,
fpos, ftell(fp), FUNCTIONCALL_TYPE, statement_index + 1, -1);
statement_index++;
safe_free(token);
return(1);
}
else
{
//pushback all input
info_message("Missing close parenthesis in function call\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
//pushback all input
info_message("Bad argument list\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
//pushback all input
info_message("Missing open parenthesis in function call\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
//get next token
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
//look for if
if(strcmp(token,"if")==0)
{
memset(token, '\0', strlen(token));
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)
{
//reserve a statement index number
temp_index = statement_index;
statement_index++;
//save file position
fpos2 = ftell(fp);
if(parse_statementblock(fp))
{
//Valid if statement found
//determine if jump statement exists
if(statement_index == temp_index +1)
jump = -1;
else
jump = temp_index +1;
insert_statement_record(&statement_table, temp_index,
fpos, fpos2, IF_TYPE,
statement_index, jump);
safe_free(token);
return(1);
}
else
{
info_message("Bad statement block in if statement\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing close parenthesis in if statement.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Bad logic expression in if statement.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing open parenthesis in if statement\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
//look for while
if(strcmp(token,"while")==0)
{
memset(token, '\0', strlen(token));
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)
{
//reserve a statement index number
temp_index = statement_index;
statement_index++;
//save file position
fpos2 = ftell(fp);
if(parse_statementblock(fp))
{
//Valid while statement found
insert_statement_record(&statement_table, temp_index,
fpos, fpos2, WHILE_TYPE,
statement_index, temp_index + 1);
safe_free(token);
return(1);
}
else
{
info_message("Bad statement block in while statement\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing close parenthesis in while statement.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Bad logic expression in while statement.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing open parenthesis in while statement\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
//look for goto
if(strcmp(token,"goto")==0)
{
if(parse_identifier(fp))
{
//Valid goto statement found
insert_statement_record(&statement_table, statement_index,
fpos, ftell(fp), GOTO_TYPE, statement_index + 1, -1);
statement_index++;
safe_free(token);
return(1);
}
else
{
info_message("Badly formed goto statement\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
//look for label
if(strcmp(token,"label")==0)
{
if(parse_identifier(fp))
{
//Valid goto statement found
insert_statement_record(&statement_table, statement_index,
fpos, ftell(fp), LABEL_TYPE, statement_index + 1, -1);
//Pushback entire statement...
fseek(fp,fpos,SEEK_SET);
//get LABEL token...
memset(token, '\0', strlen(token));
token = get_next_token(fp, token);
//throwaway the LABEL token and get the identifier...
memset(token, '\0', strlen(token));
token = get_next_token(fp, token);
//add to symbol table...
temp_index = add_identifier_to_st(&symbol_table, token,
SY_LABEL_TYPE, 0);
//record statement index in symbol table
set_value_in_st(symbol_table, temp_index,
0, 0.0, "", statement_index);
//exit successfully.
statement_index++;
safe_free(token);
return(1);
}
else
{
info_message("Badly formed label statement\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
//look for assignment, first pushback token
fseek(fp,fpos,SEEK_SET);
memset(token, '\0', strlen(token));
if(parse_identifier(fp))
{
memset(token, '\0', strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,"=")==0)
{
if(parse_expr(fp))
{
//Valid assignment
//production statement::identifier = expr
insert_statement_record(&statement_table, statement_index,
fpos, ftell(fp), ASSIGNMENT_TYPE, statement_index + 1, -1);
statement_index++;
safe_free(token);
return(1);
}
else
{
info_message("Bad expr in assignment.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing operator in assignment.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
safe_free(token);
return(0);
}
int parse_declaration(FILE *fp)
{
char *token;
long fpos;
long fpos2;
//set original file position
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"int")==0)
{
if(parse_identifier(fp))
{
//Valid int declaration
fpos2 = ftell(fp);
insert_statement_record(&statement_table, statement_index,
fpos, fpos2, DECLARATION_TYPE, statement_index +1, -1);
statement_index++;
safe_free(token);
return(1);
}
else
{
info_message("Missing identifier for int declaration\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
if(strcmp(token,"float")==0)
{
if(parse_identifier(fp))
{
//Valid float declaration
fpos2 = ftell(fp);
insert_statement_record(&statement_table, statement_index,
fpos, fpos2, DECLARATION_TYPE, statement_index +1, -1);
statement_index++;
safe_free(token);
return(1);
}
else
{
info_message("Missing identifier for float declaration\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
if(strcmp(token,"string")==0)
{
if(parse_identifier(fp))
{
memset(token, '\0', strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,"[")==0)
{
if(parse_integer(fp))
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,"]")==0)
{
fpos2 = ftell(fp);
//Valid string declaration
insert_statement_record(&statement_table, statement_index,
fpos, fpos2, DECLARATION_TYPE, statement_index +1, -1);
statement_index++;
safe_free(token);
return(1);
}
else
{
info_message("Missing close bracket for string declaration\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing size for string declaration\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing open bracket for string declaration\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
info_message("Missing identifier for string declaration\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
int parse_statementblock(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,"begin")==0)
{
if(parse_statementlist(fp))
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,"end")==0)
{
//Valid statementblock found
safe_free(token);
return(1);
}
else
{
info_message("Missing end for begin.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
if(strcmp(token,"end")==0)
{
//Valid statementblock found
safe_free(token);
return(1);
}
else
{
info_message("Missing end for begin.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
}
else
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
int parse_arglist(FILE *fp)
{
char *token;
long fpos;
long fpos2;
fpos = ftell(fp);
if(parse_expr(fp))
{
fpos2 = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp, token);
if(strcmp(token,",")==0)
{
if(parse_arglist(fp))
{
//Valid arglist
//production arglist::expr, arglist
safe_free(token);
return(1);
}
else
{
//Invalid but how?
info_message("Missing arglist following comma.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
//Valid arglist
//production arglist::expr
fseek(fp,fpos2,SEEK_SET);
safe_free(token);
return(1);
}
}
if(parse_string(fp))
{
fpos2 = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp, token);
if(strcmp(token,",")==0)
{
if(parse_arglist(fp))
{
//Valid arglist
//production arglist::string, arglist
safe_free(token);
return(1);
}
else
{
//Invalid but how?
info_message("Missing arglist following comma.\n");
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(0);
}
}
else
{
//Valid arglist
//production arglist::string
fseek(fp,fpos2,SEEK_SET);
safe_free(token);
return(1);
}
}
//Valid empty arglist
//production arglist::e
return(1);
}
int parse_fname(FILE *fp)
{
//This function must check all defined functions in
//the macro language
char *token;
long fpos;
fpos = ftell(fp);
if((token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char))) == NULL)
{
printf("Failed safe_alloc in parse_fname\n");
return(0);
}
token = get_next_token(fp,token);
if(strcmp(token,"outfile")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"out")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"infile")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"inuser")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"invar")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"randomInt")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"randomFloat")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"sleep")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"getError")==0)
{
safe_free(token);
return(1);
}
if(strcmp(token,"intToFloat")==0)
{
safe_free(token);
return(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -