MEGATRON



LOG | FILES | OVERVIEW


#ifndef PROGRAM_H
#define PROGRAM_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <queue.h>
#include <lexer.h>
#include <assert.h>

struct token;
enum Keyword;

enum Options_Target_Type
{
	OPTION_TARGET_TOKENS,
	OPTION_TARGET_AST,
	OPTION_TARGET_C,
	OPTION_DEFAULT,
};

struct Source
{
	size_t src_size;
	size_t where_in_src;
	size_t current_column;
	size_t current_row;
	char *src_name;
	char *src;

};

struct Options
{
	enum Options_Target_Type target;
	int is_quiet:1;
	int providing_own_queue_implementation:1;
	int providing_own_buffer_implementation:1;
	int has_mutex:1;
	int has_context:1;
	char *src_name;
	char *output_name;
};
	
struct Error
{
	char *message;
	size_t row;
	size_t column;
};

struct Translation_Data
{
	struct Queue *errors;
	struct Queue *tokens;
	size_t hold_number_of_errors;
	struct Map *hold_command_map;
};
struct Program
{
	struct Source *source;
	
};

struct Source* extract_source(char *src_name);
struct Options* parse_command_line(int argc,char **argv);
struct Translation_Data* get_translation_data();
struct Error* get_error(char *message,size_t row,size_t column);

void push_lexing_error(char *error_message,struct Source *src,struct Translation_Data *translation_data);
void push_parsing_error(char *error_message,struct Translation_Data *translation_data);
void push_error_with_token(char *error_message,struct token *token,struct Translation_Data *translation_data);
char has_new_errors(struct Translation_Data *translation_data);
void touch_errors(struct Translation_Data *translation_data);
char get_and_check(struct Translation_Data *translation_data,enum Keyword kw);
enum Keyword get_kw(struct Translation_Data *translation_data);
void chomp(struct Translation_Data *translation_data);

void delete_translation_data(struct Translation_Data *data);
void delete_source(struct Source *src);
void delete_options(struct Options *options);
void delete_error(struct Error *error);


#endif