From 79b8219a7b8a786740a6c57b2d819953bcf261de Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 25 Mar 2014 06:57:44 +0800 Subject: verbose error reporting --- ast.c | 16 ++++++++-------- ast.h | 2 +- cibic.l | 19 ++++++++++++++----- cibic.y | 7 +++++-- main.c | 12 ++++++------ 5 files changed, 34 insertions(+), 22 deletions(-) diff --git a/ast.c b/ast.c index 1b930fc..0ca0271 100644 --- a/ast.c +++ b/ast.c @@ -81,12 +81,12 @@ CNode *cnode_create_int_const(int val) { return exp; } -CNode *cnode_create_char_const(int val) { +CNode *cnode_create_char_const(char *val) { /* TODO: overflow checking */ CNode *exp = NEW_CNODE; exp->type = CHAR; exp->chd = exp->next = NULL; - exp->rec.intval = val; + exp->rec.strval = val; return exp; } @@ -375,13 +375,13 @@ char *cnode_debug_type_repr(CNode *ast) { } void cnode_debug_print_plain(CNode *ast) { - printf("(%s", cnode_debug_type_repr(ast)); + fprintf(stderr, "(%s", cnode_debug_type_repr(ast)); for (ast = ast->chd; ast; ast = ast->next) { - printf(" "); + fprintf(stderr, " "); cnode_debug_print_plain(ast); } - printf(")"); + fprintf(stderr, ")"); } void cnode_debug_print_fancy(CNode *ast, int lvl) { @@ -389,10 +389,10 @@ void cnode_debug_print_fancy(CNode *ast, int lvl) { int i; show[lvl] = 1; for (i = 0; i < lvl - 1; i++) - printf("%c ", show[i] ? '|' : ' '); + fprintf(stderr, "%c ", show[i] ? '|' : ' '); if (lvl) - printf("|____"); - printf("[%s]\n", cnode_debug_type_repr(ast)); + fprintf(stderr, "|____"); + fprintf(stderr, "[%s]\n", cnode_debug_type_repr(ast)); for (ast = ast->chd; ast; ast = ast->next) { if (!ast->next) show[lvl] = 0; diff --git a/ast.h b/ast.h index 3399cb7..f467546 100644 --- a/ast.h +++ b/ast.h @@ -89,7 +89,7 @@ CNode *cnode_create_plain_decl(CNode *type_spec, CNode *declr); CNode *cnode_create_identifier(char *val); CNode *cnode_create_int_const(int val); -CNode *cnode_create_char_const(int val); +CNode *cnode_create_char_const(char *val); CNode *cnode_create_str_const(char *val); void cnode_debug_print(CNode *ast, int fancy); diff --git a/cibic.l b/cibic.l index cd9b6eb..75244a0 100644 --- a/cibic.l +++ b/cibic.l @@ -1,12 +1,20 @@ %{ #include "cibic.tab.h" +int yycolumn = 1; +#define YY_USER_ACTION \ + yylloc.first_line = yylloc.last_line = yylineno; \ + yylloc.first_column = yycolumn; yylloc.last_column = yycolumn + yyleng - 1; \ + yycolumn += yyleng; + %} letter [a-zA-Z_$] digit [0-9] %s IN_BLOCK_COMMENT IN_INLINE_COMMENT IN_DIRECTIVE +%option yylineno %% + { "/*" BEGIN(IN_BLOCK_COMMENT); } @@ -14,22 +22,22 @@ digit [0-9] "*/" BEGIN(INITIAL); [^*\n]+ // eat comment in chunks "*" // eat the lone star -\n +\n { yycolumn = 1; } } { "//" BEGIN(IN_INLINE_COMMENT); } { -\n BEGIN(INITIAL); +\n { yycolumn = 1; BEGIN(INITIAL); } [^\n]+ } { -"#" BEGIN(IN_INLINE_COMMENT); +"#" BEGIN(IN_DIRECTIVE); } { -\n BEGIN(INITIAL); +\n { yycolumn = 1; BEGIN(INITIAL); } [^\n]+ } @@ -99,6 +107,7 @@ digit [0-9] [();,={}\[\]*|\^&<>+\-*//%~!.] { return *yytext; } -[ \t\n\r] /* skip whitespaces */ +[ \t\r] /* skip whitespaces */ +\n { yycolumn = 1; } . { return UNKNOWN; } %% diff --git a/cibic.y b/cibic.y index bbe7375..ada0306 100644 --- a/cibic.y +++ b/cibic.y @@ -7,7 +7,7 @@ char *strval; struct CNode *cnode; } - +%error-verbose %token IDENTIFIER INT_CONST CHAR_CONST STR_CONST %token KW_VOID KW_CHAR KW_INT KW_STRUCT KW_UNION KW_IF KW_ELSE KW_WHILE %token KW_FOR KW_CONT KW_BREAK KW_RET KW_SIZEOF @@ -161,7 +161,10 @@ jump_statement expression : assignment_expression - | expression ',' assignment_expression { $$ = cnode_create_exp(',', 2, $1, $3); } + | expression ',' assignment_expression { + printf("%d, %d\n", @$.first_line, @$.first_column); + $$ = cnode_create_exp(',', 2, $1, $3); + } assignment_expression : logical_or_expression diff --git a/main.c b/main.c index 463d290..d82d911 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include #include +#include #include "cibic.tab.h" #include "ast.h" @@ -12,21 +13,20 @@ int yywrap() { } int yyerror(char *s) { + fprintf(stderr, "%s\n", s); } void print_ast() { - yyparse(); if (fname) - printf("AST for file: \"%s\"\n", fname); + fprintf(stderr, "AST for file: \"%s\"\n", fname); else - printf("AST for stdin\n"); - + fprintf(stderr, "AST for stdin\n"); + yyparse(); if (ast_root) { cnode_debug_print(ast_root, 1); } - else - fprintf(stdout, "Syntax Error\n"); + else exit(1); } void print_help() { -- cgit v1.2.3-70-g09d2