#ifndef PRINT_C
#define PRINT_C PRINT_C
#include<print.h>
void print_keyword_enum(enum Keyword code)
{
switch(code)
{
case KW_MACHINE:
printf("KW_MACHINE");
break;
case KW_FROM:
printf("KW_FROM");
break;
case KW_TO:
printf("KW_TO");
break;
case KW_ON:
printf("KW_ON");
break;
case KW_ID:
printf("KW_ID");
break;
case KW_STRING:
printf("KW_STRING");
break;
case KW_NOP:
printf("KW_NOP");
break;
case KW_EOF:
printf("KW_EOF");
break;
case KW_OPEN_SQUARE:
printf("KW_OPEN_SQUARE");
break;
case KW_CLOSE_SQUARE:
printf("KW_CLOSE_SQUARE");
break;
case KW_OPEN_NORMAL:
printf("KW_OPEN_NORMAL");
break;
case KW_CLOSE_NORMAL:
printf("KW_CLOSE_NORMAL");
break;
case KW_PIPE:
printf("KW_PIPE");
break;
case KW_SEMI_COLUMN:
printf("KW_SEMI_COLUMN");
break;
case KW_STARTING:
printf("KW_STARTING");
break;
case KW_STATES:
printf("KW_STATES");
break;
case KW_EVENTS:
printf("KW_EVENTS");
break;
case KW_EVENT:
printf("KW_EVENT");
break;
case KW_EXECUTE:
printf("KW_EXECUTE");
break;
case KW_TRANSITIONS:
printf("KW_TRANSITIONS");
break;
case KW_COMMA:
printf("KW_COMMA");
break;
case KW_DOT:
printf("KW_DOT");
break;
case KW_AND:
printf("KW_AND");
break;
case KW_OR:
printf("KW_OR");
break;
case KW_NOT:
printf("KW_NOT");
break;
case KW_IF:
printf("KW_IF");
break;
case KW_ELSE:
printf("KW_ELSE");
break;
case KW_GRANTED:
printf("KW_GRANTED");
break;
case KW_ENTERING:
printf("KW_ENTERING");
break;
case KW_EXITING:
printf("KW_EXITING");
break;
default:
printf("LEXERROR");
}
}
void print_token(struct token *token)
{
size_t i;
assert(token);
printf("[ ");
print_keyword_enum(token->type);
printf(" ");
for(i=0;i<token->size;++i)
printf("%c",token->data[i]);
printf(" ] ");
}
void print_tokens(struct Queue *tokens)
{
struct Queue_Node *it;
assert(tokens);
for(it=tokens->first;it!=NULL;it=it->prev)
{
print_token( (struct token*)(it->data));
printf(" ");
}
}
void print_ast_enum(enum AST_Type type)
{
switch(type)
{
case AST_TYPE_TRANSLATION_UNIT:
printf("AST_TYPE_TRANSLATION_UNIT");
break;
case AST_TYPE_MACHINE:
printf("AST_TYPE_MACHINE");
break;
case AST_TYPE_STATE:
printf("AST_TYPE_STATE");
break;
case AST_TYPE_STATES:
printf("AST_TYPE_STATES");
break;
case AST_TYPE_EVENT:
printf("AST_TYPE_EVENT");
break;
case AST_TYPE_EVENTS:
printf("AST_TYPE_EVENTS");
break;
case AST_TYPE_TRANSITION:
printf("AST_TYPE_TRANSITION");
break;
case AST_TYPE_TRANSITIONS:
printf("AST_TYPE_TRANSITIONS");
break;
case AST_TYPE_COMMAND:
printf("AST_TYPE_COMMAND");
break;
case AST_TYPE_PIPELINE:
printf("AST_TYPE_PIPELINE");
break;
case AST_TYPE_OP_AND:
printf("AST_TYPE_OP_AND");
break;
case AST_TYPE_OP_OR:
printf("AST_TYPE_OP_OR");
break;
case AST_TYPE_OP_NOT:
printf("AST_TYPE_OP_NOT");
break;
case AST_TYPE_OP_SELECTOR:
printf("AST_TYPE_OP_SELECTOR");
break;
case AST_TYPE_UNFINISHED_STATE:
printf("AST_TYPE_UNFINISHED_STATE");
break;
case AST_TYPE_IF:
printf("AST_TYPE_IF");
break;
default:
printf("AST_NOP");
}
}
void print_ast(struct AST *tree)
{
assert(tree);
switch(tree->type)
{
case AST_TYPE_MACHINE:
print_ast_machine((struct AST_Machine*)tree);
break;
case AST_TYPE_STATE:
print_ast_state((struct AST_State*)tree);
break;
case AST_TYPE_STATES:
print_ast_states((struct AST_States*)tree);
break;
case AST_TYPE_EVENT:
print_ast_event((struct AST_Event*)tree);
break;
case AST_TYPE_EVENTS:
print_ast_events((struct AST_Events*)tree);
break;
case AST_TYPE_TRANSITION:
print_ast_transition((struct AST_Transition*)tree);
break;
case AST_TYPE_TRANSITIONS:
print_ast_transitions((struct AST_Transitions*)tree);
break;
case AST_TYPE_COMMAND:
print_ast_command((struct AST_Command*)tree);
break;
case AST_TYPE_PIPELINE:
print_ast_pipeline((struct AST_Pipeline*)tree);
break;
case AST_TYPE_TRANSLATION_UNIT:
print_ast_translation_unit((struct AST_Translation_Unit*)tree);
break;
case AST_TYPE_OP_AND:
case AST_TYPE_OP_OR:
case AST_TYPE_OP_SELECTOR:
print_ast_binary_expression((struct AST_Binary_Expression*)tree);
break;
case AST_TYPE_OP_NOT:
print_ast_unary_expression((struct AST_Unary_Expression*)tree);
break;
case AST_TYPE_UNFINISHED_STATE:
print_ast_unchecked_state((struct AST_Unchecked_State*)tree);
break;
case AST_TYPE_IF:
print_ast_if_statement((struct AST_If_Statement*)tree);
break;
default:
printf("noast");
}
}
void print_ast_state(struct AST_State* tree)
{
assert(tree);
printf("[ STATE: ");
print_token(tree->name);
printf(" %ld",tree->number);
printf("]");
}
void print_ast_event(struct AST_Event* tree)
{
assert(tree);
printf("[ EVENT: ");
print_token(tree->name);
printf("]");
}
void print_ast_states(struct AST_States* tree)
{
size_t i;
assert(tree);
printf("STATES [\n");
for(i=0;i<tree->number_of_states;++i)
{
print_ast_state(tree->states[i]);
printf(" ");
}
printf("\n ] END STATES \n");
}
void print_ast_events(struct AST_Events* tree)
{
size_t i;
assert(tree);
printf("EVENTS [\n");
for(i=0;i<tree->number_of_events;++i)
{
print_ast_event(tree->events[i]);
printf(" ");
}
printf("\n ] END EVENTS \n");
}
void print_ast_transition(struct AST_Transition* tree)
{
assert(tree);
printf("TRANSITION [\nFROM");
print_ast_state(tree->from);
printf(" TO ");
print_ast_state(tree->to);
printf(" COMMAND {");
if(tree->statement==NULL)
{
printf("NULL");
}else
{
print_ast(tree->statement);
}
}
void print_ast_command(struct AST_Command* tree)
{
assert(tree);
printf("( command ");
print_token(tree->function_name);
if(tree->argument==NULL)
{
printf(" NOARGUMENTS ");
}else
{
printf(" \"");
print_token(tree->argument);
printf("\" ");
}
printf(")");
}
void print_ast_pipeline(struct AST_Pipeline* tree)
{
size_t i;
assert(tree);
printf("PIPELINE <");
for(i=0;i<tree->size;++i)
{
print_ast_command(tree->pipeline[i]);
printf(" | ");
}
printf("> PIPELINE_END");
}
void print_ast_machine(struct AST_Machine* tree)
{
assert(tree);
printf("MACHINE ");
print_token(tree->id);
printf(" [\n");
print_ast_states(tree->states);
print_ast_events(tree->events);
print_ast_transitions(tree->transitions);
printf("] MACHINE_END\n");
}
void print_ast_transitions(struct AST_Transitions* tree)
{
size_t i;
assert(tree);
printf("TRANSITIONS [\n");
for(i=0;i<tree->size;++i)
{
print_ast_transition(tree->transitions[i]);
printf("\n");
}
printf("] TRANSITIONS_END\n");
}
void print_error(struct Error *error)
{
assert(error);
printf("Error: %s, line %ld row %ld\n",error->message,error->row,error->column);
}
void print_errors(struct Translation_Data *translation_data)
{
struct Queue_Node *it;
assert(translation_data);
for(it=translation_data->errors->first;it!=NULL;it=it->prev)
{
print_error(it->data);
}
}
void print_ast_translation_unit(struct AST_Translation_Unit *tree)
{
size_t i;
printf("TRANSLATION UNIT\n[\n");
for(i=0;i<tree->number_of_machines;++i)
print_ast_machine(tree->machines[i]);
printf("\n] TRANSLATION UNIT END \n");
}
void print_ast_binary_expression(struct AST_Binary_Expression *tree)
{
printf(" (");
print_ast(tree->left);
switch(tree->type)
{
case AST_TYPE_OP_AND:
printf("&&");
break;
case AST_TYPE_OP_OR:
printf("||");
break;
case AST_TYPE_OP_SELECTOR:
printf(".");
break;
default:
printf("?!!?!?!?");
}
print_ast(tree->right);
printf(")");
}
void print_ast_unary_expression(struct AST_Unary_Expression *tree)
{
printf("(!");
print_ast(tree->operand);
printf(")");
}
void print_ast_unchecked_state(struct AST_Unchecked_State *tree)
{
print_token(tree->name);
}
void print_ast_if_statement(struct AST_If_Statement *tree)
{
printf("if <");
print_ast(tree->condition);
printf(">\n");
print_ast(tree->body);
if(tree->else_statement)
print_ast(tree->else_statement);
}
#endif