fancier errors

This commit is contained in:
anon
2024-07-05 21:28:53 +02:00
parent e3ca37009f
commit 17f4b004c5
10 changed files with 71 additions and 11 deletions

View File

@ -66,7 +66,10 @@ bootstrap:
test: ${OUT} test: ${OUT}
#fcpp -C -LL debug/xop.eax > debug/xop.eax.pp #fcpp -C -LL debug/xop.eax > debug/xop.eax.pp
${WRAP} ./${OUT} debug/xop.eax #${WRAP} ./${OUT} debug/xop.eax
${WRAP} ./${OUT} debug/artimetrics.eax
@echo " --- ERROR TESTING BEGINS BELOW ---"
debug/error_test.sh
clean: clean:
-rm ${OUT} ${OBJECT} ${GENOBJECT} ${GENSOURCE} -rm ${OUT} ${OBJECT} ${GENOBJECT} ${GENSOURCE}

5
debug/error_test.sh Executable file
View File

@ -0,0 +1,5 @@
./eaxhla debug/unclosed_program.eax
./eaxhla debug/unknown_instruction.eax
./eaxhla debug/multi_error.eax
./eaxhla debug/unclosed_comment.eax
./eaxhla debug/unclosed_artimetric.eax

11
debug/multi_error.eax Normal file
View File

@ -0,0 +1,11 @@
program main
k8 kek
begin
wigglecall func
xor $rsp $rsp
xor $rsp $rsp
poke $rsp
xor $rsp $rsp
xor $rsp $rsp
xor $rsp $rsp
end program

View File

@ -0,0 +1,3 @@
program a
begin
[

View File

@ -0,0 +1,4 @@
/*
reeeeeeee
reeeeeeeee
reeeeee

View File

@ -0,0 +1,4 @@
unix
program main
exit 1
end rpogram

View File

@ -0,0 +1,8 @@
procedure a
nop
end procedure
unix
program main
wigglecall a
end program

View File

@ -11,7 +11,7 @@
string_literal_buffer = malloc(128); string_literal_buffer = malloc(128);
void yyfree_leftovers(void); void yyfree_leftovers(void);
void yyerror(void); void yyerror(const char * errmsg);
%} %}
%option noyywrap %option noyywrap
@ -23,7 +23,7 @@ uhex [0123456789ABCDEF]
%x IN_COMMENT IN_MULTILINE_COMMENT %x IN_COMMENT IN_MULTILINE_COMMENT
%x IN_STRING %x IN_STRING
%x IN_END %x IN_END IN_UNKNOWN_END
%x IN_ARTIMETRIC_BLOCK %x IN_ARTIMETRIC_BLOCK
%option nodefault %option nodefault
@ -111,11 +111,15 @@ loop { BEGIN INITIAL; return END_LOOP; }
if { BEGIN INITIAL; return END_IF; } if { BEGIN INITIAL; return END_IF; }
machine { BEGIN INITIAL; return END_MACHINE; } machine { BEGIN INITIAL; return END_MACHINE; }
{wsnl} { ; } {wsnl} { ; }
. { yyerror(); } . { yyless(0); BEGIN IN_UNKNOWN_END; }
}
<IN_UNKNOWN_END>{
.* { yyerror("unknown end sequence"); BEGIN INITIAL; return 0; }
} }
<IN_STRING>{ <IN_STRING>{
/* XXX: escapes */ /* XXX: escapes; multiline strings will die */
\" { \" {
BEGIN INITIAL; BEGIN INITIAL;
yylval.strval = strdup(string_literal_buffer); yylval.strval = strdup(string_literal_buffer);
@ -136,11 +140,13 @@ machine { BEGIN INITIAL; return END_MACHINE; }
<IN_COMMENT>{ <IN_COMMENT>{
\n { BEGIN INITIAL; } \n { BEGIN INITIAL; }
.* { ; } .* { ; }
<<EOF>> { yytext = strdup("<EOF>"); yyerror("unterminated comment"); yyterminate(); }
} }
<IN_MULTILINE_COMMENT>{ <IN_MULTILINE_COMMENT>{
\*\/ { BEGIN INITIAL; } \*\/ { BEGIN INITIAL; }
.|\n { ; } .|\n { ; }
<<EOF>> { yytext = strdup("<EOF>"); yyerror("unterminated comment"); yyterminate(); }
} }
<INITIAL,IN_ARTIMETRIC_BLOCK>{ <INITIAL,IN_ARTIMETRIC_BLOCK>{
@ -163,12 +169,13 @@ machine { BEGIN INITIAL; return END_MACHINE; }
yylval.intval = strtol(yytext + 2, NULL, 16); yylval.intval = strtol(yytext + 2, NULL, 16);
return LITERAL; return LITERAL;
} }
<<EOF>> { yytext = strdup("<EOF>"); yyerror("unterminated artimetric block"); yyterminate(); }
} }
{identifier} { yylval.strval = strdup(yytext); return IDENTIFIER; } {identifier} { yylval.strval = strdup(yytext); return IDENTIFIER; }
{identifier}: { yylval.strval = strdup(yytext); return LABEL; } {identifier}: { yylval.strval = strdup(yytext); return LABEL; }
. { yyerror(); } . { yyerror("scanner jammed"); }
%% %%

View File

@ -26,10 +26,15 @@
#include "assembler.h" #include "assembler.h"
extern void yyfree_leftovers(void); extern void yyfree_leftovers(void);
extern char * yyfilename;
void yyerror() { void yyerror(const char * errmsg) {
printf("\033[31mError: syntax error at line %d near '%s'.\033[0m\n", yylineno, yytext); printf("\033[1m%s:%d:\033[0m \033[31mError\033[0m: %s near \033[1m'%s'\033[0m.\n",
yyfree_leftovers(); yyfilename,
yylineno,
errmsg,
yytext
);
} }
long new_static(int size) { long new_static(int size) {
@ -38,6 +43,8 @@
} }
%} %}
// %define parse.error detailed
%union{ %union{
long intval; long intval;
char * strval; char * strval;
@ -121,6 +128,7 @@ function_specifier: %empty
declaration_section: %empty declaration_section: %empty
| declaration declaration_section | declaration declaration_section
| error declaration_section { yyerrok; }
; ;
declaration: origin type IDENTIFIER { $2.name = $3; /* add_var($1); */ free($3); } declaration: origin type IDENTIFIER { $2.name = $3; /* add_var($1); */ free($3); }
@ -143,6 +151,7 @@ type: S8 { $$ = (static_variable){ .is_signed = 1, .size = 8, .address = new
; ;
code: %empty code: %empty
| error code { yyerrok; }
| loop code | loop code
| if code | if code
| call code | call code
@ -239,7 +248,7 @@ immediate: LITERAL
artimetric_block: '[' artimetric_expression ']' { $$ = $2; } artimetric_block: '[' artimetric_expression ']' { $$ = $2; }
; ;
artimetric_expression: %empty { yyerror(); } artimetric_expression: %empty { YYERROR; }
| artimetric_operand | 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; }
@ -257,3 +266,5 @@ exit: EXIT immediate
| EXIT IDENTIFIER | EXIT IDENTIFIER
; ;
%% %%

View File

@ -5,6 +5,8 @@
extern void yyfree_leftovers(void); extern void yyfree_leftovers(void);
char * yyfilename;
signed main(int argc, char * argv[]) { signed main(int argc, char * argv[]) {
if (argc < 2) { if (argc < 2) {
printf("%s: <file>\n", argv[0]); printf("%s: <file>\n", argv[0]);
@ -14,7 +16,9 @@ signed main(int argc, char * argv[]) {
yydebug = 1; yydebug = 1;
#endif #endif
yyin = fopen(argv[1], "r"); yyfilename = argv[1];
yyin = fopen(yyfilename, "r");
yyparse(); yyparse();
yyfree_leftovers(); yyfree_leftovers();