summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2015-12-07 02:47:50 +0800
committerTing-Wei Lan <lantw44@gmail.com>2015-12-07 02:47:50 +0800
commit9f1f1c719ced16636fa9e37d3cea5a9e782b72b6 (patch)
treea561d501947461af6059df026ee40522053f5ae5
parent39b409c9625f427966ae577aa3caa4d8caaa56a0 (diff)
downloadcompiler2015-9f1f1c719ced16636fa9e37d3cea5a9e782b72b6.tar
compiler2015-9f1f1c719ced16636fa9e37d3cea5a9e782b72b6.tar.gz
compiler2015-9f1f1c719ced16636fa9e37d3cea5a9e782b72b6.tar.bz2
compiler2015-9f1f1c719ced16636fa9e37d3cea5a9e782b72b6.tar.lz
compiler2015-9f1f1c719ced16636fa9e37d3cea5a9e782b72b6.tar.xz
compiler2015-9f1f1c719ced16636fa9e37d3cea5a9e782b72b6.tar.zst
compiler2015-9f1f1c719ced16636fa9e37d3cea5a9e782b72b6.zip
Re-add line number fields in AST nodes
It is required to show line numbers in error messages.
-rw-r--r--src/ast.c19
-rw-r--r--src/ast.h16
-rw-r--r--src/parser.y313
-rw-r--r--src/semantic-analysis.c29
4 files changed, 225 insertions, 152 deletions
diff --git a/src/ast.c b/src/ast.c
index 5eac631..2ba1e7d 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -10,7 +10,7 @@
#include <stdlib.h>
-CcmmcAst *ccmmc_ast_new(CcmmcAstNodeType type_node)
+CcmmcAst *ccmmc_ast_new(CcmmcAstNodeType type_node, size_t line_number)
{
CcmmcAst *node;
node = malloc(sizeof(CcmmcAst));
@@ -22,6 +22,7 @@ CcmmcAst *ccmmc_ast_new(CcmmcAstNodeType type_node)
node->right_sibling = NULL;
node->type_node = type_node;
node->type_value = CCMMC_AST_VALUE_NONE;
+ node->line_number = line_number;
return node;
}
@@ -77,32 +78,32 @@ CcmmcAst *ccmmc_ast_append_children(
return parent;
}
-CcmmcAst *ccmmc_ast_new_id(char *lexeme, CcmmcKindId kind)
+CcmmcAst *ccmmc_ast_new_id(char *lexeme, CcmmcKindId kind, size_t line_number)
{
- CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_ID);
+ CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_ID, line_number);
node->value_id.kind = kind;
node->value_id.name = lexeme;
// node->value_id.symbolTableEntry = NULL;
return node;
}
-CcmmcAst *ccmmc_ast_new_stmt(CcmmcKindStmt kind)
+CcmmcAst *ccmmc_ast_new_stmt(CcmmcKindStmt kind, size_t line_number)
{
- CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_STMT);
+ CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_STMT, line_number);
node->value_stmt.kind = kind;
return node;
}
-CcmmcAst *ccmmc_ast_new_decl(CcmmcKindDecl kind)
+CcmmcAst *ccmmc_ast_new_decl(CcmmcKindDecl kind, size_t line_number)
{
- CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_DECL);
+ CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_DECL, line_number);
node->value_decl.kind = kind;
return node;
}
-CcmmcAst *ccmmc_ast_new_expr(CcmmcKindExpr kind, int op_kind)
+CcmmcAst *ccmmc_ast_new_expr(CcmmcKindExpr kind, int op_kind, size_t line_number)
{
- CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_EXPR);
+ CcmmcAst *node = ccmmc_ast_new(CCMMC_AST_NODE_EXPR, line_number);
node->value_expr.kind = kind;
node->value_expr.is_const_eval = false;
if (kind == CCMMC_KIND_EXPR_BINARY_OP)
diff --git a/src/ast.h b/src/ast.h
index 2d5802d..8af5c8c 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -132,6 +132,7 @@ typedef struct CcmmcAst_struct {
struct CcmmcAst_struct *right_sibling;
CcmmcAstNodeType type_node;
CcmmcAstValueType type_value;
+ size_t line_number;
union {
CcmmcValueId value_id;
CcmmcValueStmt value_stmt;
@@ -141,13 +142,18 @@ typedef struct CcmmcAst_struct {
};
} CcmmcAst;
-CcmmcAst *ccmmc_ast_new (CcmmcAstNodeType type_node);
+CcmmcAst *ccmmc_ast_new (CcmmcAstNodeType type_node,
+ size_t line_number);
CcmmcAst *ccmmc_ast_new_id (char *lexeme,
- CcmmcKindId kind);
-CcmmcAst *ccmmc_ast_new_stmt (CcmmcKindStmt kind);
-CcmmcAst *ccmmc_ast_new_decl (CcmmcKindDecl kind);
+ CcmmcKindId kind,
+ size_t line_number);
+CcmmcAst *ccmmc_ast_new_stmt (CcmmcKindStmt kind,
+ size_t line_number);
+CcmmcAst *ccmmc_ast_new_decl (CcmmcKindDecl kind,
+ size_t line_number);
CcmmcAst *ccmmc_ast_new_expr (CcmmcKindExpr kind,
- int op_kind);
+ int op_kind,
+ size_t line_number);
CcmmcAst *ccmmc_ast_append_sibling (CcmmcAst *node,
CcmmcAst *sibling);
CcmmcAst *ccmmc_ast_append_child (CcmmcAst *parent,
diff --git a/src/parser.y b/src/parser.y
index 0f83f65..7db3c47 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -86,13 +86,15 @@ static void ccmmc_parser_error(yyscan_t scanner, CcmmcState *state, const char *
program : global_decl_list
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_PROGRAM);
+ $$ = ccmmc_ast_new(
+ CCMMC_AST_NODE_PROGRAM, state->line_number);
ccmmc_ast_append_child($$, $1);
state->ast = $$;
}
|
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_PROGRAM);
+ $$ = ccmmc_ast_new(
+ CCMMC_AST_NODE_PROGRAM, state->line_number);
state->ast = $$;
}
;
@@ -123,42 +125,52 @@ global_decl : type_decl
function_decl : type ID DL_LPAREN param_list DL_RPAREN DL_LBRACE block DL_RBRACE
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_FUNCTION);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_FUNCTION, state->line_number);
CcmmcAst *param_list = ccmmc_ast_new(
- CCMMC_AST_NODE_PARAM_LIST);
+ CCMMC_AST_NODE_PARAM_LIST, state->line_number);
ccmmc_ast_append_child(param_list, $4);
ccmmc_ast_append_children($$, 4, $1,
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL),
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number),
param_list, $7);
}
| VOID ID DL_LPAREN param_list DL_RPAREN DL_LBRACE block DL_RBRACE
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_FUNCTION);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_FUNCTION, state->line_number);
CcmmcAst *param_list = ccmmc_ast_new(
- CCMMC_AST_NODE_PARAM_LIST);
+ CCMMC_AST_NODE_PARAM_LIST, state->line_number);
ccmmc_ast_append_child(param_list, $4);
ccmmc_ast_append_children($$, 4,
- ccmmc_ast_new_id("void", CCMMC_KIND_ID_NORMAL),
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL),
+ ccmmc_ast_new_id("void",
+ CCMMC_KIND_ID_NORMAL, state->line_number),
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number),
param_list, $7);
}
| type ID DL_LPAREN DL_RPAREN DL_LBRACE block DL_RBRACE
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_FUNCTION);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_FUNCTION, state->line_number);
CcmmcAst *empty_param_list = ccmmc_ast_new(
- CCMMC_AST_NODE_PARAM_LIST);
+ CCMMC_AST_NODE_PARAM_LIST, state->line_number);
ccmmc_ast_append_children($$, 4, $1,
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL),
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number),
empty_param_list, $6);
}
| VOID ID DL_LPAREN DL_RPAREN DL_LBRACE block DL_RBRACE
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_FUNCTION);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_FUNCTION, state->line_number);
CcmmcAst *empty_param_list = ccmmc_ast_new(
- CCMMC_AST_NODE_PARAM_LIST);
+ CCMMC_AST_NODE_PARAM_LIST, state->line_number);
ccmmc_ast_append_children($$, 4,
- ccmmc_ast_new_id("void", CCMMC_KIND_ID_NORMAL),
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL),
+ ccmmc_ast_new_id("void",
+ CCMMC_KIND_ID_NORMAL, state->line_number),
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number),
empty_param_list, $6);
}
;
@@ -175,16 +187,20 @@ param_list : param_list DL_COMMA param
param : type ID
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_FUNCTION_PARAMETER);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_FUNCTION_PARAMETER, state->line_number);
ccmmc_ast_append_children($$, 2, $1,
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL));
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number));
}
| type ID dim_fn
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_FUNCTION_PARAMETER);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_FUNCTION_PARAMETER, state->line_number);
ccmmc_ast_append_children($$, 2, $1,
ccmmc_ast_append_child(
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_ARRAY), $3));
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_ARRAY, state->line_number), $3));
}
;
@@ -204,35 +220,39 @@ expr_null :expr
}
|
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL, state->line_number);
}
;
block : decl_list stmt_list
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK, state->line_number);
ccmmc_ast_append_children($$, 2,
ccmmc_ast_append_child(
- ccmmc_ast_new(CCMMC_AST_NODE_VARIABLE_DECL_LIST), $1),
+ ccmmc_ast_new(CCMMC_AST_NODE_VARIABLE_DECL_LIST,
+ state->line_number), $1),
ccmmc_ast_append_child(
- ccmmc_ast_new(CCMMC_AST_NODE_STMT_LIST), $2));
+ ccmmc_ast_new(CCMMC_AST_NODE_STMT_LIST,
+ state->line_number), $2));
}
| stmt_list
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK, state->line_number);
ccmmc_ast_append_child($$,
ccmmc_ast_append_child(
- ccmmc_ast_new(CCMMC_AST_NODE_STMT_LIST), $1));
+ ccmmc_ast_new(CCMMC_AST_NODE_STMT_LIST,
+ state->line_number), $1));
}
| decl_list
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK, state->line_number);
ccmmc_ast_append_child($$,
ccmmc_ast_append_child(
- ccmmc_ast_new(CCMMC_AST_NODE_VARIABLE_DECL_LIST), $1));
+ ccmmc_ast_new(CCMMC_AST_NODE_VARIABLE_DECL_LIST,
+ state->line_number), $1));
}
| {
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_BLOCK, state->line_number);
}
;
@@ -258,53 +278,71 @@ decl : type_decl
type_decl : TYPEDEF type id_list DL_SEMICOL
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_TYPE);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_TYPE, state->line_number);
ccmmc_ast_append_children($$, 2, $2, $3);
}
| TYPEDEF VOID id_list DL_SEMICOL
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_TYPE);
- ccmmc_ast_append_children($$, 2, ccmmc_ast_new_id("void", CCMMC_KIND_ID_NORMAL), $3);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_TYPE, state->line_number);
+ ccmmc_ast_append_children($$, 2,
+ ccmmc_ast_new_id("void",
+ CCMMC_KIND_ID_NORMAL, state->line_number), $3);
}
;
var_decl : type init_id_list DL_SEMICOL
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_VARIABLE);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_VARIABLE, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $2);
}
| ID id_list DL_SEMICOL
{
- $$ = ccmmc_ast_new_decl(CCMMC_KIND_DECL_VARIABLE);
- ccmmc_ast_append_children($$, 2, ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL), $2);
+ $$ = ccmmc_ast_new_decl(
+ CCMMC_KIND_DECL_VARIABLE, state->line_number);
+ ccmmc_ast_append_children($$, 2,
+ ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_NORMAL, state->line_number), $2);
}
;
type : INT
{
- $$ = ccmmc_ast_new_id("int", CCMMC_KIND_ID_NORMAL);
+ $$ = ccmmc_ast_new_id("int",
+ CCMMC_KIND_ID_NORMAL, state->line_number);
}
| FLOAT
{
- $$ = ccmmc_ast_new_id("float", CCMMC_KIND_ID_NORMAL);
+ $$ = ccmmc_ast_new_id("float",
+ CCMMC_KIND_ID_NORMAL, state->line_number);
}
;
id_list : ID
{
- $$ = ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL);
+ $$ = ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_NORMAL, state->line_number);
}
| id_list DL_COMMA ID
{
- $$ = ccmmc_ast_append_sibling($1, ccmmc_ast_new_id($3, CCMMC_KIND_ID_NORMAL));
+ $$ = ccmmc_ast_append_sibling($1,
+ ccmmc_ast_new_id($3,
+ CCMMC_KIND_ID_NORMAL, state->line_number));
}
| id_list DL_COMMA ID dim_decl
{
- $$ = ccmmc_ast_append_sibling($1, ccmmc_ast_append_child(ccmmc_ast_new_id($3, CCMMC_KIND_ID_ARRAY), $4));
+ $$ = ccmmc_ast_append_sibling($1,
+ ccmmc_ast_append_child(
+ ccmmc_ast_new_id($3,
+ CCMMC_KIND_ID_ARRAY, state->line_number), $4));
}
| ID dim_decl
{
- $$ = ccmmc_ast_append_child(ccmmc_ast_new_id($1, CCMMC_KIND_ID_ARRAY), $2);
+ $$ = ccmmc_ast_append_child(
+ ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_ARRAY, state->line_number), $2);
}
;
@@ -320,12 +358,14 @@ dim_decl : DL_LBRACK cexpr DL_RBRACK
cexpr : cexpr OP_ADD mcexpr
{
- $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_ADD);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_ADD, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $3);
} /* This is for array declarations */
| cexpr OP_SUB mcexpr
{
- $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_SUB);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_SUB, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $3);
}
| mcexpr
@@ -336,12 +376,14 @@ cexpr : cexpr OP_ADD mcexpr
mcexpr : mcexpr OP_MUL cfactor
{
- $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_MUL);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_MUL, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $3);
}
| mcexpr OP_DIV cfactor
{
- $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_DIV);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_DIV, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $3);
}
| cfactor
@@ -352,7 +394,8 @@ mcexpr : mcexpr OP_MUL cfactor
cfactor: CONST
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_CONST_VALUE);
+ $$ = ccmmc_ast_new(
+ CCMMC_AST_NODE_CONST_VALUE, state->line_number);
$$->value_const = $1;
}
| DL_LPAREN cexpr DL_RPAREN
@@ -373,16 +416,19 @@ init_id_list: init_id
init_id : ID
{
- $$ = ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL);
+ $$ = ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_NORMAL, state->line_number);
}
| ID dim_decl
{
$$ = ccmmc_ast_append_child(
- ccmmc_ast_new_id($1, CCMMC_KIND_ID_ARRAY), $2);
+ ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_ARRAY, state->line_number), $2);
}
| ID OP_ASSIGN relop_expr
{
- $$ = ccmmc_ast_new_id($1, CCMMC_KIND_ID_WITH_INIT);
+ $$ = ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_WITH_INIT, state->line_number);
ccmmc_ast_append_child($$, $3);
}
;
@@ -403,47 +449,47 @@ stmt : DL_LBRACE block DL_RBRACE
}
| WHILE DL_LPAREN relop_expr DL_RPAREN stmt
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_WHILE);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_WHILE, state->line_number);
ccmmc_ast_append_children($$, 2, $3, $5);
}
| FOR DL_LPAREN assign_expr_list DL_SEMICOL relop_expr_list DL_SEMICOL assign_expr_list DL_RPAREN stmt
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_FOR);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_FOR, state->line_number);
ccmmc_ast_append_children($$, 4, $3, $5, $7, $9);
}
| var_ref OP_ASSIGN relop_expr DL_SEMICOL
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_ASSIGN);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_ASSIGN, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $3);
}
| IF DL_LPAREN relop_expr DL_RPAREN stmt
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_IF);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_IF, state->line_number);
ccmmc_ast_append_children($$, 3, $3, $5,
- ccmmc_ast_new(CCMMC_AST_NODE_NUL));
+ ccmmc_ast_new(CCMMC_AST_NODE_NUL, state->line_number));
}
| IF DL_LPAREN relop_expr DL_RPAREN stmt ELSE stmt
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_IF);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_IF, state->line_number);
ccmmc_ast_append_children($$, 3, $3, $5, $7);
}
| ID DL_LPAREN relop_expr_list DL_RPAREN DL_SEMICOL
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_FUNCTION_CALL);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_FUNCTION_CALL, state->line_number);
ccmmc_ast_append_children($$, 2,
- ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL), $3);
+ ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL, state->line_number), $3);
}
| DL_SEMICOL
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL, state->line_number);
}
| RETURN DL_SEMICOL
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_RETURN);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_RETURN, state->line_number);
}
| RETURN relop_expr DL_SEMICOL
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_RETURN);
+ $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_RETURN, state->line_number);
ccmmc_ast_append_child($$, $2);
}
;
@@ -451,12 +497,12 @@ stmt : DL_LBRACE block DL_RBRACE
assign_expr_list: nonempty_assign_expr_list
{
$$ = ccmmc_ast_new(
- CCMMC_AST_NODE_NONEMPTY_ASSIGN_EXPR_LIST);
+ CCMMC_AST_NODE_NONEMPTY_ASSIGN_EXPR_LIST, state->line_number);
ccmmc_ast_append_child($$, $1);
}
|
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL, state->line_number);
}
;
@@ -472,9 +518,11 @@ nonempty_assign_expr_list : nonempty_assign_expr_list DL_COMMA assign_expr
assign_expr : ID OP_ASSIGN relop_expr
{
- $$ = ccmmc_ast_new_stmt(CCMMC_KIND_STMT_ASSIGN);
+ $$ = ccmmc_ast_new_stmt(
+ CCMMC_KIND_STMT_ASSIGN, state->line_number);
ccmmc_ast_append_children($$, 2,
- ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL), $3);
+ ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_NORMAL, state->line_number), $3);
}
| relop_expr
{
@@ -488,8 +536,8 @@ relop_expr : relop_term
}
| relop_expr OP_OR relop_term
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_OR);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_OR, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $3);
}
;
@@ -500,8 +548,8 @@ relop_term : relop_factor
}
| relop_term OP_AND relop_factor
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_AND);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_AND, state->line_number);
ccmmc_ast_append_children($$, 2, $1, $3);
}
;
@@ -519,33 +567,33 @@ relop_factor : expr
rel_op : OP_EQ
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_EQ);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_EQ, state->line_number);
}
| OP_GE
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_GE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_GE, state->line_number);
}
| OP_LE
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_LE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_LE, state->line_number);
}
| OP_NE
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_NE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_NE, state->line_number);
}
| OP_GT
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_GT);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_GT, state->line_number);
}
| OP_LT
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_LT);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_LT, state->line_number);
}
;
@@ -553,12 +601,12 @@ rel_op : OP_EQ
relop_expr_list : nonempty_relop_expr_list
{
$$ = ccmmc_ast_new(
- CCMMC_AST_NODE_NONEMPTY_RELOP_EXPR_LIST);
+ CCMMC_AST_NODE_NONEMPTY_RELOP_EXPR_LIST, state->line_number);
ccmmc_ast_append_child($$, $1);
}
|
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_NUL, state->line_number);
}
;
@@ -585,13 +633,13 @@ expr : expr add_op term
add_op : OP_ADD
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_ADD);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_ADD, state->line_number);
}
| OP_SUB
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_SUB);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_SUB, state->line_number);
}
;
@@ -608,13 +656,13 @@ term : term mul_op factor
mul_op : OP_MUL
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_MUL);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_MUL, state->line_number);
}
| OP_DIV
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_BINARY_OP, CCMMC_KIND_OP_BINARY_DIV);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_BINARY_OP,
+ CCMMC_KIND_OP_BINARY_DIV, state->line_number);
}
;
@@ -624,86 +672,93 @@ factor : DL_LPAREN relop_expr DL_RPAREN
}
| OP_ADD DL_LPAREN relop_expr DL_RPAREN
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_POSITIVE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_POSITIVE, state->line_number);
ccmmc_ast_append_child($$, $3);
}
| OP_SUB DL_LPAREN relop_expr DL_RPAREN
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_NEGATIVE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_NEGATIVE, state->line_number);
ccmmc_ast_append_child($$, $3);
}
| OP_NOT DL_LPAREN relop_expr DL_RPAREN
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION, state->line_number);
ccmmc_ast_append_child($$, $3);
}
| CONST
{
- $$ = ccmmc_ast_new(CCMMC_AST_NODE_CONST_VALUE);
+ $$ = ccmmc_ast_new(CCMMC_AST_NODE_CONST_VALUE, state->line_number);
$$->value_const = $1;
}
| OP_ADD CONST
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_POSITIVE);
- CcmmcAst *const_node = ccmmc_ast_new(CCMMC_AST_NODE_CONST_VALUE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_POSITIVE, state->line_number);
+ CcmmcAst *const_node = ccmmc_ast_new(
+ CCMMC_AST_NODE_CONST_VALUE, state->line_number);
const_node->value_const = $2;
ccmmc_ast_append_child($$, const_node);
}
| OP_SUB CONST
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_NEGATIVE);
- CcmmcAst *const_node = ccmmc_ast_new(CCMMC_AST_NODE_CONST_VALUE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_NEGATIVE, state->line_number);
+ CcmmcAst *const_node = ccmmc_ast_new(
+ CCMMC_AST_NODE_CONST_VALUE, state->line_number);
const_node->value_const = $2;
ccmmc_ast_append_child($$, const_node);
}
| OP_NOT CONST
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION);
- CcmmcAst *const_node = ccmmc_ast_new(CCMMC_AST_NODE_CONST_VALUE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION, state->line_number);
+ CcmmcAst *const_node = ccmmc_ast_new(
+ CCMMC_AST_NODE_CONST_VALUE, state->line_number);
const_node->value_const = $2;
ccmmc_ast_append_child($$, const_node);
}
| ID DL_LPAREN relop_expr_list DL_RPAREN
{
$$ = ccmmc_ast_new_stmt(
- CCMMC_KIND_STMT_FUNCTION_CALL);
+ CCMMC_KIND_STMT_FUNCTION_CALL, state->line_number);
ccmmc_ast_append_children($$, 2,
- ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL), $3);
+ ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_NORMAL, state->line_number), $3);
}
| OP_ADD ID DL_LPAREN relop_expr_list DL_RPAREN
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_POSITIVE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_POSITIVE, state->line_number);
CcmmcAst *func_node = ccmmc_ast_new_stmt(
- CCMMC_KIND_STMT_FUNCTION_CALL);
+ CCMMC_KIND_STMT_FUNCTION_CALL, state->line_number);
ccmmc_ast_append_children(func_node, 2,
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL), $4);
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number), $4);
ccmmc_ast_append_child($$, func_node);
}
| OP_SUB ID DL_LPAREN relop_expr_list DL_RPAREN
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_NEGATIVE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_NEGATIVE, state->line_number);
CcmmcAst *func_node = ccmmc_ast_new_stmt(
- CCMMC_KIND_STMT_FUNCTION_CALL);
+ CCMMC_KIND_STMT_FUNCTION_CALL, state->line_number);
ccmmc_ast_append_children(func_node, 2,
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL), $4);
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number), $4);
ccmmc_ast_append_child($$, func_node);
}
| OP_NOT ID DL_LPAREN relop_expr_list DL_RPAREN
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION, state->line_number);
CcmmcAst *func_node = ccmmc_ast_new_stmt(
- CCMMC_KIND_STMT_FUNCTION_CALL);
+ CCMMC_KIND_STMT_FUNCTION_CALL, state->line_number);
ccmmc_ast_append_children(func_node, 2,
- ccmmc_ast_new_id($2, CCMMC_KIND_ID_NORMAL), $4);
+ ccmmc_ast_new_id($2,
+ CCMMC_KIND_ID_NORMAL, state->line_number), $4);
ccmmc_ast_append_child($$, func_node);
}
| var_ref
@@ -712,31 +767,33 @@ factor : DL_LPAREN relop_expr DL_RPAREN
}
| OP_ADD var_ref
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_POSITIVE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_POSITIVE, state->line_number);
ccmmc_ast_append_child($$, $2);
}
| OP_SUB var_ref
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_NEGATIVE);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_NEGATIVE, state->line_number);
ccmmc_ast_append_child($$, $2);
}
| OP_NOT var_ref
{
- $$ = ccmmc_ast_new_expr(
- CCMMC_KIND_EXPR_UNARY_OP, CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION);
+ $$ = ccmmc_ast_new_expr(CCMMC_KIND_EXPR_UNARY_OP,
+ CCMMC_KIND_OP_UNARY_LOGICAL_NEGATION, state->line_number);
ccmmc_ast_append_child($$, $2);
}
;
var_ref : ID
{
- $$ = ccmmc_ast_new_id($1, CCMMC_KIND_ID_NORMAL);
+ $$ = ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_NORMAL, state->line_number);
}
| ID dim_list
{
- $$ = ccmmc_ast_new_id($1, CCMMC_KIND_ID_ARRAY);
+ $$ = ccmmc_ast_new_id($1,
+ CCMMC_KIND_ID_ARRAY, state->line_number);
ccmmc_ast_append_child($$, $2);
}
;
diff --git a/src/semantic-analysis.c b/src/semantic-analysis.c
index 9bed272..98e71bb 100644
--- a/src/semantic-analysis.c
+++ b/src/semantic-analysis.c
@@ -93,8 +93,9 @@ static CcmmcValueConst eval_const_expr(CcmmcAst *expr) {
if (left.kind == CCMMC_KIND_CONST_INT) {
if (right.kind == CCMMC_KIND_CONST_INT) {
if (right.const_int == 0) {
- fprintf(stderr, ERROR("Integer division by zero."), (size_t)0);
- // XXX: We should use an invalid type
+ fprintf(stderr, ERROR("Integer division by zero."),
+ expr->line_number);
+ // XXX: We should have an invalid type
return (CcmmcValueConst){ .kind = CCMMC_KIND_CONST_STRING };
}
return (CcmmcValueConst){ .kind = CCMMC_KIND_CONST_INT,
@@ -142,12 +143,14 @@ static size_t *get_array_size(CcmmcAst *id_array, size_t *array_dimension)
for (dim = id_array->child; dim != NULL; dim = dim->right_sibling, dim_index++) {
CcmmcValueConst value = eval_const_expr(dim);
if (value.kind != CCMMC_KIND_CONST_INT) {
- fprintf(stderr, ERROR("Array subscript is not an integer."), (size_t)0);
+ fprintf(stderr, ERROR("Array subscript is not an integer."),
+ dim->line_number);
free(array_size);
return NULL;
}
if (value.const_int <= 0) {
- fprintf(stderr, ERROR("Array size must be positive."), (size_t)0);
+ fprintf(stderr, ERROR("Array size must be positive."),
+ dim->line_number);
free(array_size);
return NULL;
}
@@ -191,11 +194,13 @@ static bool process_typedef(CcmmcAst *type_decl, CcmmcSymbolTable *table)
// We don't support an existing array typedef
assert(ccmmc_symbol_is_scalar(source_sym));
if (source_sym == NULL) {
- fprintf(stderr, ERROR("ID `%s' undeclared."), (size_t)0, source_str);
+ fprintf(stderr, ERROR("ID `%s' undeclared."),
+ type_decl->line_number, source_str);
return true;
}
if (source_sym->kind != CCMMC_SYMBOL_KIND_TYPE) {
- fprintf(stderr, ERROR("ID `%s' is not a type."), (size_t)0, source_str);
+ fprintf(stderr, ERROR("ID `%s' is not a type."),
+ type_decl->line_number, source_str);
return true;
}
@@ -206,7 +211,8 @@ static bool process_typedef(CcmmcAst *type_decl, CcmmcSymbolTable *table)
const char *target_str = id->value_id.name;
if (ccmmc_symbol_scope_exist(table->current, target_str)) {
any_error = true;
- fprintf (stderr, ERROR("ID `%s' redeclared."), (size_t)0, target_str);
+ fprintf (stderr, ERROR("ID `%s' redeclared."),
+ id->line_number, target_str);
continue;
}
switch (id->value_id.kind) {
@@ -252,11 +258,13 @@ static bool process_variable(CcmmcAst *var_decl, CcmmcSymbolTable *table)
const char *type_str = var_decl->child->value_id.name;
CcmmcSymbol *type_sym = ccmmc_symbol_table_retrive(table, type_str);
if (type_sym == NULL) {
- fprintf(stderr, ERROR("ID `%s' undeclared."), (size_t)0, type_str);
+ fprintf(stderr, ERROR("ID `%s' undeclared."),
+ var_decl->line_number, type_str);
return true;
}
if (type_sym->kind != CCMMC_SYMBOL_KIND_TYPE) {
- fprintf(stderr, ERROR("ID `%s' is not a type."), (size_t)0, type_str);
+ fprintf(stderr, ERROR("ID `%s' is not a type."),
+ var_decl->line_number, type_str);
return true;
}
@@ -267,7 +275,8 @@ static bool process_variable(CcmmcAst *var_decl, CcmmcSymbolTable *table)
const char *var_str = init_id->value_id.name;
if (ccmmc_symbol_scope_exist(table->current, var_str)) {
any_error = true;
- fprintf (stderr, ERROR("ID `%s' redeclared."), (size_t)0, var_str);
+ fprintf (stderr, ERROR("ID `%s' redeclared."),
+ init_id->line_number, var_str);
continue;
}
switch (init_id->value_id.kind) {