#ifndef PARSER_H
#define PARSER_H PARSER_H
#include <program.h>
#include <stddef.h>
#include <assert.h>
#include <map.h>
#define AS_BIN_EXPR_PTR(x) ((struct AST_Binary_Expression*)x)
#define AS_UN_EXPR_PTR(x) ((struct AST_Unary_Expression*)x)
#define AS_UNCK_EXPR_PTR(x) ((struct AST_Unchecked_State*)x)
enum AST_Type
{
AST_TYPE_TRANSLATION_UNIT,
AST_TYPE_MACHINE,
AST_TYPE_STATE,
AST_TYPE_STATES,
AST_TYPE_EVENT,
AST_TYPE_EVENTS,
AST_TYPE_TRANSITION,
AST_TYPE_TRANSITIONS,
AST_TYPE_COMMAND,
AST_TYPE_PIPELINE,
AST_TYPE_OP_AND,
AST_TYPE_OP_OR,
AST_TYPE_OP_NOT,
AST_TYPE_OP_SELECTOR,
AST_TYPE_UNFINISHED_STATE,
AST_TYPE_IF,
};
struct AST
{
enum AST_Type type;
};
struct AST_State
{
enum AST_Type type;
struct token *name;
struct AST_Machine *parent;
size_t number;
struct AST *on_entry_statement;
struct AST *on_exit_statement;
};
struct AST_Event
{
struct token *name;
};
struct AST_States
{
enum AST_Type type;
size_t number_of_states;
struct Map *states_map;
struct AST_State *states[];
};
struct AST_Events
{
enum AST_Type type;
size_t number_of_events;
struct Map *events_map;
struct AST_Event *events[];
};
struct AST_Transition
{
enum AST_Type type;
struct AST_State *from;
struct AST_State *to;
struct AST_Event *event;
struct AST *granted;
struct AST *statement;
};
struct AST_Command
{
enum AST_Type type;
struct token *function_name;
struct token *argument;
};
struct AST_Pipeline
{
enum AST_Type type;
size_t size;
struct AST_Command *pipeline[];
};
struct AST_Transitions
{
enum AST_Type type;
size_t size;
struct AST_Transition *transitions[];
};
struct AST_Machine
{
enum AST_Type type;
struct token *id;
struct AST_State *starting_state;
struct AST_States *states;
struct AST_Events *events;
struct AST_Transitions *transitions;
};
struct AST_Translation_Unit
{
enum AST_Type type;
struct Map *used_commands_map;
struct Map *machines_map;
size_t number_of_machines;
struct AST_Machine *machines[];
};
struct AST_Binary_Expression
{
enum AST_Type type;
struct AST *left;
struct AST *right;
};
struct AST_Unary_Expression
{
enum AST_Type type;
struct AST *operand;
};
struct AST_Unchecked_State
{
enum AST_Type type;
struct token *name;
};
struct AST_If_Statement
{
enum AST_Type type;
struct AST *condition;
struct AST *body;
struct AST *else_statement;
};
struct AST* parse_source(struct Translation_Data *translation_data);
struct AST_Translation_Unit* parse_translation_unit(struct Translation_Data *translation_data);
struct AST_Machine* parse_machine(struct Translation_Data *translation_data);
struct AST_Machine* parse_machine_inner(struct token *machine_id,struct Translation_Data *translation_data);
struct AST_States* parse_states_inner(struct Translation_Data *translation_data);
struct AST_State* parse_state(struct Translation_Data *translation_data);
struct AST_Events* parse_events_inner(struct Translation_Data *translation_data);
struct AST_Event* parse_event(struct Translation_Data *translation_data);
struct AST_Transitions* parse_transitions_inner(struct Translation_Data *translation_data,struct AST_States *states,struct AST_Events *events );
struct AST_Transition* parse_transition(struct Translation_Data *translation_data,struct AST_States *states,struct AST_Events *events);
struct AST* parse_transition_granted(struct Translation_Data *translation_data,struct AST_States *states,struct AST_Events *events);
struct AST* parse_statement(struct Translation_Data *translation_data);
struct AST_Pipeline* parse_pipeline(struct Translation_Data *translation_data);
struct AST_Command* parse_command(struct Translation_Data *translation_data);
struct AST_State* parse_start_on(struct Translation_Data *translation_data,struct AST_States *states);
struct AST* parse_expression(struct Translation_Data *translation_data);
struct AST* parse_or_expression(struct Translation_Data *translation_data);
struct AST* parse_and_expression(struct Translation_Data *translation_data);
struct AST* parse_not_expression(struct Translation_Data *translation_data);
struct AST* parse_primary_expression(struct Translation_Data *translation_data);
struct AST_State* get_ast_state(struct token *id,struct AST *entry,struct AST *exit);
struct AST_Event* get_ast_event(struct token *id);
struct AST_States* get_ast_states(struct Queue *states,struct Translation_Data *translation_data);
struct AST_Events* get_ast_events(struct Queue *events);
struct AST_Transition* get_ast_transition(struct AST_State *from,struct AST_State *to,struct AST_Event *event,struct AST *granted,struct AST *statement);
struct AST_Command* get_ast_command(struct token *function_name,struct token *argument);
struct AST_Pipeline* get_ast_pipeline(struct Queue *pipeline);
struct AST_Machine* get_ast_machine(struct token *id,struct AST_States *states,struct AST_Events *events,struct AST_Transitions *transitions,struct AST_State *starting_state);
struct AST_Transitions* get_ast_transitions(struct Queue *transitions);
struct AST_Translation_Unit* get_ast_translation_unit(struct Queue *machines,struct Map *command_map,struct Map *machines_map);
struct AST_Binary_Expression* get_ast_binary_expression(struct AST *left,struct AST *right,enum AST_Type type);
struct AST_Unary_Expression* get_ast_unary_expression(struct AST *operand,enum AST_Type type);
struct AST_Unchecked_State* get_ast_unchecked_state(struct token *name);
struct AST_If_Statement* get_ast_if_statement(struct AST *condition,struct AST *body,struct AST *else_statement);
struct AST_State* ast_check_state(struct AST_Unchecked_State *state,struct AST_States *states,struct Translation_Data *translation_data);
void delete_ast(struct AST* ast);
void delete_ast_event(struct AST_Event* ast);
void delete_ast_states(struct AST_States* ast);
void delete_ast_state(struct AST_State* ast);
void delete_ast_events(struct AST_Events* ast);
void delete_ast_transition(struct AST_Transition* ast);
void delete_ast_command(struct AST_Command* ast);
void delete_ast_pipeline(struct AST_Pipeline* ast);
void delete_ast_machine(struct AST_Machine* ast);
void delete_ast_transitions(struct AST_Transitions* ast);
void delete_ast_translation_unit(struct AST_Translation_Unit *ast);
void delete_ast_binary_expression(struct AST_Binary_Expression *ast);
void delete_ast_unary_expression(struct AST_Unary_Expression *ast);
void delete_ast_unchecked_state(struct AST_Unchecked_State *ast);
void delete_ast_if_statement(struct AST_If_Statement *ast);
void pointer_array_fill(void **array,struct Queue *q);
struct Queue* parse_list(struct AST *(*parser)(struct Translation_Data*),struct Translation_Data *translation_data,enum Keyword delim);
#endif