diff options
author | Adam Branes <adam@adam> | 2021-05-02 17:46:29 +0300 |
---|---|---|
committer | Galin Simeonov <gts@volconst.com> | 2021-07-15 18:00:07 +0300 |
commit | 679cbe58c4e53f0163588a7731154f3afe2d25aa (patch) | |
tree | a2dbc2317a3f107899d60f5e68c8d6cf8d27e146 /program.c | |
parent | a3e36c1918e63761dfc4d2221cca3636b98e93aa (diff) | |
download | MEGATRON-679cbe58c4e53f0163588a7731154f3afe2d25aa.tar.gz |
lexer formed
Diffstat (limited to 'program.c')
-rw-r--r-- | program.c | 109 |
1 files changed, 109 insertions, 0 deletions
@@ -1,5 +1,114 @@ #ifndef PROGRAM_C #define PROGRAM_C +#include<program.h> +struct Source* extract_source(char *src_name) +{ + FILE *file; + struct Source *ret; + + file=fopen(src_name,"r"); + if(file==NULL) + return NULL; + if(fseek(file,0L,SEEK_END)!=0) + return NULL; + + ret=malloc(sizeof(struct Source)); + ret->src_size=ftell(file); + ret->where_in_src=0; + ret->src_name=src_name; + ret->src=malloc(ret->src_size); + ret->current_column=0; + ret->current_row=0; + + fseek(file,0L,SEEK_SET); + + + fread(ret->src,sizeof(char),ret->src_size,file); + + fclose(file); + return ret; +} +struct Options* parse_command_line(char **argv) +{ + struct Options *ret; + size_t i; + + ret=malloc(sizeof(struct Options)); + ret->print_tokens=1; + ret->source=argv[1]; + return ret; +} +struct Translation_Data* get_translation_data() +{ + struct Translation_Data *ret; + ret=malloc(sizeof(struct Translation_Data)); + ret->errors=malloc(sizeof(struct Queue)); + ret->tokens=malloc(sizeof(struct Queue)); + + Queue_Init(ret->errors); + Queue_Init(ret->tokens); + + ret->hold_number_of_errors=0; + + return ret; +} +struct Error* get_error(char *message,size_t row,size_t column) +{ + struct Error *ret; + ret=malloc(sizeof(struct Error)); + ret->message=message; + ret->row=row; + ret->column=column; +} +void push_lexing_error(char *error_message,struct Source *src,struct Translation_Data *translation_data) +{ + Queue_Push(translation_data->errors,get_error(error_message,src->current_row,src->current_column)); +} +void push_parsing_error(char *error_message,struct token *token ,struct Translation_Data *translation_data) +{ + Queue_Push(translation_data->errors,get_error(error_message,token->row,token->column)); +} +char has_new_errors(struct Translation_Data *translation_data) +{ + if(translation_data->hold_number_of_errors!=translation_data->errors->size) + { + translation_data->hold_number_of_errors=translation_data->errors->size; + return 1; + }else + { + return 0; + } +} + +void delete_translation_data(struct Translation_Data *data) +{ + struct Error *hold_error; + struct token *hold_token; + + while(data->tokens->size>0) + delete_token(Queue_Pop(data->tokens)); + free(data->tokens); + while(data->errors->size>0) + delete_error(Queue_Pop(data->errors)); + free(data->errors); + + free(data); +} +void delete_source(struct Source *src) +{ + free(src->src_name); + free(src->src); + free(src); +} +void delete_options(struct Options *options) +{ + free(options); +} +void delete_error(struct Error *error) +{ + free(error->message); + free(error); +} #endif |