diff --git a/source/eaxhla.l b/source/eaxhla.l index 14b234a..a33598e 100644 --- a/source/eaxhla.l +++ b/source/eaxhla.l @@ -1,6 +1,7 @@ %{ #include #include "eaxhla.tab.h" + #include "table.h" char * string_literal_buffer; int string_litral_buffer_size = 0; @@ -22,6 +23,7 @@ uhex [0123456789ABCDEF] %x IN_COMMENT IN_MULTILINE_COMMENT %x IN_STRING +%x IN_END // XXX: ?! %x IN_DECLARE @@ -36,18 +38,23 @@ uhex [0123456789ABCDEF] begin{wsnl}+ { return MYBEGIN; } - /* XXX 'end' should be its own state, with proper error handling */ program{wsnl}+ { return PROGRAM; } -end{wsnl}+program{wsnl}+ { return END_PROGRAM; } procedure{wsnl}+ { return PROCEDURE; } -end{wsnl}+procedure{wsnl}+ { return END_PROCEDURE; } loop{wsnl}+ { return TLOOP; } -end{wsnl}+loop{wsnl}+ { return END_LOOP; } if{wsnl}+ { return IF; } then{wsnl}+ { return THEN; } -end{wsnl}+if{wsnl}+ { return END_IF; } break{wsnl}+ { return BREAK; } +end { BEGIN IN_END; } + +{ +program { BEGIN INITIAL; return END_PROGRAM; } +procedure { BEGIN INITIAL; return END_PROCEDURE; } +loop { BEGIN INITIAL; return END_LOOP; } +if { BEGIN INITIAL; return END_IF; } +{wsnl} { ; } +. { yyerror(); } +} fast{wsnl}+ { return FAST; } unix{wsnl}+ { return UNIX; } @@ -139,7 +146,7 @@ fastcall{wsnl}+ { return FASTCALL; } .|\n { ; } } -{identifier}{wsnl}+ { yylval.strval = strdup(yytext); return IDENTIFIER; } +{identifier} { yylval.strval = strdup(yytext); return IDENTIFIER; } . { yyerror(); } diff --git a/source/eaxhla.y b/source/eaxhla.y index c224b71..eba1390 100644 --- a/source/eaxhla.y +++ b/source/eaxhla.y @@ -5,6 +5,7 @@ } %code requires { + #include "table.h" // XXX this could be easily squashed later typedef struct { int is_signed; @@ -55,7 +56,7 @@ %token PROGRAM END_PROGRAM %token PROCEDURE END_PROCEDURE %token TLOOP END_LOOP -%token IF THEN END_IF +%token IF THEN ELSE END_IF %token BREAK %token IDENTIFIER @@ -147,6 +148,7 @@ loop: TLOOP code END_LOOP ; if: IF logic THEN code END_IF + | IF logic THEN code ELSE code END_IF ; logic: %empty /* XXX */ diff --git a/source/table.h b/source/table.h index bedfe22..105fb85 100644 --- a/source/table.h +++ b/source/table.h @@ -3,9 +3,10 @@ #include typedef struct { - /* size_t size; */ - /* int * hash; */ - /* void * data; */ + short size; + int * hash; + void * data; + long address; tommy_node node; } value_table_t;