From 7cae7f968fc9ce54994f8bfccf29825006e98ad5 Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 5 Jul 2024 14:41:56 +0200 Subject: [PATCH] + artimetric blocks --- Makefile | 1 + debug/artimetrics.eax | 6 +++ source/eaxhla.l | 97 +++++++++++++++++++------------------------ source/eaxhla.y | 25 +++++++++-- 4 files changed, 71 insertions(+), 58 deletions(-) create mode 100644 debug/artimetrics.eax diff --git a/Makefile b/Makefile index 66442a5..bb9c40f 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,7 @@ endif CFLAGS += -Wall -Wextra -Wpedantic CPPFLAGS += -Ilibrary/tommyds +LDFLAGS += -lm OUT := eaxhla diff --git a/debug/artimetrics.eax b/debug/artimetrics.eax new file mode 100644 index 0000000..d247c1d --- /dev/null +++ b/debug/artimetrics.eax @@ -0,0 +1,6 @@ +procedure test + u8 a = [8 + 8] + u8 b = [2 ^ 8] + u8 c = [2 ^ 8 + [2 * 3]] +begin +end procedure diff --git a/source/eaxhla.l b/source/eaxhla.l index 1adcbbc..c31150c 100644 --- a/source/eaxhla.l +++ b/source/eaxhla.l @@ -24,10 +24,7 @@ uhex [0123456789ABCDEF] %x IN_COMMENT IN_MULTILINE_COMMENT %x IN_STRING %x IN_END - - // XXX: ?! -%x IN_DECLARE -%x IN_UGH +%x IN_ARTIMETRIC_BLOCK %option nodefault %option yylineno @@ -50,16 +47,6 @@ exit{wsnl}+ { return EXIT; } 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; } -machine { BEGIN INITIAL; return END_MACHINE; } -{wsnl} { ; } -. { yyerror(); } -} - fast{wsnl}+ { return FAST; } unix{wsnl}+ { return UNIX; } @@ -103,28 +90,30 @@ u16{wsnl}+ { return U16; } u32{wsnl}+ { return U32; } u64{wsnl}+ { return U64; } --?[[:digit:]]+ { - yylval.intval = strtol(yytext, NULL, 10); - return LITERAL; -} - -0b[01]+ { - yylval.intval = strtol(yytext, NULL, 2); - return LITERAL; - } - -0x{hex}+ { - yylval.intval = strtol(yytext + 2, NULL, 16); - return LITERAL; - } - -0x{uhex}+ { - yylval.intval = strtol(yytext + 2, NULL, 16); - return LITERAL; - } - \" { BEGIN IN_STRING; } +xor{wsnl}+ { return TXOR; } +inc{wsnl}+ { return TINC; } + +fastcall{wsnl}+ { return FASTCALL; } + +\/\/ { BEGIN IN_COMMENT; } +\/\* { BEGIN IN_MULTILINE_COMMENT; } + +\[ { return '['; } +\] { return ']'; } +\+|\-|\*|\/|\%|\^ { return yytext[0]; } + +{ +program { BEGIN INITIAL; return END_PROGRAM; } +procedure { BEGIN INITIAL; return END_PROCEDURE; } +loop { BEGIN INITIAL; return END_LOOP; } +if { BEGIN INITIAL; return END_IF; } +machine { BEGIN INITIAL; return END_MACHINE; } +{wsnl} { ; } +. { yyerror(); } +} + { /* XXX: escapes */ \" { @@ -144,14 +133,6 @@ u64{wsnl}+ { return U64; } } } -xor{wsnl}+ { return TXOR; } -inc{wsnl}+ { return TINC; } - -fastcall{wsnl}+ { return FASTCALL; } - -\/\/ { BEGIN IN_COMMENT; } -\/\* { BEGIN IN_MULTILINE_COMMENT; } - { \n { BEGIN INITIAL; } .* { ; } @@ -162,12 +143,26 @@ fastcall{wsnl}+ { return FASTCALL; } .|\n { ; } } -\[ { BEGIN IN_UGH; } +{ +-?[[:digit:]]+ { + yylval.intval = strtol(yytext, NULL, 10); + return LITERAL; +} -{ -\] { BEGIN INITIAL; yylval.strval = strdup(yytext); return IDENTIFIER; } - /* XXX! */ -.|\n { ; } +0b[01]+ { + yylval.intval = strtol(yytext, NULL, 2); + return LITERAL; + } + +0x{hex}+ { + yylval.intval = strtol(yytext + 2, NULL, 16); + return LITERAL; + } + +0x{uhex}+ { + yylval.intval = strtol(yytext + 2, NULL, 16); + return LITERAL; + } } {identifier} { yylval.strval = strdup(yytext); return IDENTIFIER; } @@ -176,14 +171,6 @@ fastcall{wsnl}+ { return FASTCALL; } %% -void set_state(int state) { - switch (state) { - case STATE_DECLARE: { - BEGIN IN_DECLARE; - } break; - } -} - void yyfree_leftovers(void) { if (yyin) { fclose(yyin); diff --git a/source/eaxhla.y b/source/eaxhla.y index 064be76..64719f8 100644 --- a/source/eaxhla.y +++ b/source/eaxhla.y @@ -20,6 +20,7 @@ %{ #include + #include #include "eaxhla.yy.h" #include "assembler.h" @@ -31,8 +32,6 @@ yyfree_leftovers(); } - extern void set_state(int state); - long new_static(int size) { (void)size; return 0; @@ -63,6 +62,8 @@ %token IDENTIFIER +%type immediate +%type artimetric_block artimetric_expression artimetric_operand %token LITERAL %token STRING_LITERAL @@ -123,7 +124,7 @@ declaration_section: %empty ; declaration: origin type IDENTIFIER { $2.name = $3; /* add_var($1); */ free($3); } - | origin type IDENTIFIER '=' LITERAL { $2.name = $3; /* add_var($1); */ free($3); } + | origin type IDENTIFIER '=' immediate { $2.name = $3; /* add_var($1); */ free($3); } | origin type IDENTIFIER '=' STRING_LITERAL { $2.name = $3; /* add_var($1); */ free($3); free($5); } ; @@ -231,6 +232,24 @@ register: RAX { $$ = R0; } ; immediate: LITERAL + | artimetric_block + ; + +artimetric_block: '[' artimetric_expression ']' { $$ = $2; } + ; + +artimetric_expression: %empty { yyerror(); } + | artimetric_operand + | artimetric_expression '+' artimetric_operand { $$ = $1 + $3; } + | artimetric_expression '-' artimetric_operand { $$ = $1 - $3; } + | artimetric_expression '*' artimetric_operand { $$ = $1 * $3; } + | artimetric_expression '/' artimetric_operand { $$ = $1 / $3; } + | artimetric_expression '%' artimetric_operand { $$ = $1 % $3; } + | artimetric_expression '^' artimetric_operand { $$ = pow($1, $3); } + ; + +artimetric_operand: immediate + | IDENTIFIER { $$ = 0; /*XXX*/ } ; exit: EXIT immediate