diff options
author | Steven Bosscher <steven@gcc.gnu.org> | 2003-04-30 19:08:12 +0000 |
---|---|---|
committer | Steven Bosscher <steven@gcc.gnu.org> | 2003-04-30 19:08:12 +0000 |
commit | 1dcfc9d1fa3f3ba7de21349fde5e83b5435dd4b4 (patch) | |
tree | 5eed3a0ac36520f5f61266349cf765c7bf2085de /gcc/treelang | |
parent | b7bfc1c0b5168ec25f7ac314bbb21d70fd802862 (diff) | |
download | gcc-1dcfc9d1fa3f3ba7de21349fde5e83b5435dd4b4.zip gcc-1dcfc9d1fa3f3ba7de21349fde5e83b5435dd4b4.tar.gz gcc-1dcfc9d1fa3f3ba7de21349fde5e83b5435dd4b4.tar.bz2 |
parse.y (make_plus_expression): New function.
* parse.y (make_plus_expression): New function.
(expression:): Use make_plus_expression for PLUS, MINUS,
ASSIGN and EQUALS.
* tree1.c (treelang_decode_option): Don't fall through to
options that start with a different character when an option
was not recognized.
From-SVN: r66303
Diffstat (limited to 'gcc/treelang')
-rw-r--r-- | gcc/treelang/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/treelang/parse.y | 166 | ||||
-rw-r--r-- | gcc/treelang/tree1.c | 15 |
3 files changed, 82 insertions, 108 deletions
diff --git a/gcc/treelang/ChangeLog b/gcc/treelang/ChangeLog index 1fc2a0b..58e4733 100644 --- a/gcc/treelang/ChangeLog +++ b/gcc/treelang/ChangeLog @@ -1,3 +1,12 @@ +2003-04-30 Steven Bosscher <steven@gcc.gnu.org> + + * parse.y (make_plus_expression): New function. + (expression production): Use make_plus_expression for PLUS, + MINUS, ASSIGN and EQUALS. + * tree1.c (treelang_decode_option): Don't fall through to + options that start with a different character when an option + was not recognized. + 2003-04-30 Nathan Sidwell <nathan@codesourcery.com> * Make-lang.in (parse.c): Reorder bison arguments for POSIXLY_CORRECT. diff --git a/gcc/treelang/parse.y b/gcc/treelang/parse.y index 3361fcf..fc6256b 100644 --- a/gcc/treelang/parse.y +++ b/gcc/treelang/parse.y @@ -83,6 +83,9 @@ static void ensure_not_void (unsigned int type, struct prod_token_parm_item* nam static int check_type_match (int type_num, struct prod_token_parm_item *exp); static int get_common_type (struct prod_token_parm_item *type1, struct prod_token_parm_item *type2); static struct prod_token_parm_item *make_integer_constant (struct prod_token_parm_item* value); +static struct prod_token_parm_item *make_plus_expression + (struct prod_token_parm_item* tok, struct prod_token_parm_item* op1, + struct prod_token_parm_item* op2, int type_code, int prod_code); static void set_storage (struct prod_token_parm_item *prod); /* File global variables. */ @@ -569,118 +572,41 @@ INTEGER { $$ = $1; } |expression tl_PLUS expression { - struct prod_token_parm_item* tok; - struct prod_token_parm_item *prod; - struct prod_token_parm_item *op1; - struct prod_token_parm_item *op2; - tree type; - - op1 = $1; - op2 = $3; - tok = $2; - ensure_not_void (NUMERIC_TYPE (op1), op1->tp.pro.main_token); - ensure_not_void (NUMERIC_TYPE (op2), op2->tp.pro.main_token); - prod = make_production (PROD_PLUS_EXPRESSION, tok); - NUMERIC_TYPE (prod) = get_common_type (op1, op2); - if (!NUMERIC_TYPE (prod)) + struct prod_token_parm_item *tok = $2; + struct prod_token_parm_item *op1 = $1; + struct prod_token_parm_item *op2 = $3; + int type_code = get_common_type (op1, op2); + if (!type_code) YYERROR; - else - { - type = get_type_for_numeric_type (NUMERIC_TYPE (prod)); - if (!type) - abort (); - OP1 (prod) = $1; - OP2 (prod) = $3; - - prod->tp.pro.code = tree_code_get_expression - (EXP_PLUS, type, op1->tp.pro.code, op2->tp.pro.code, NULL); - } - $$ = prod; + $$ = make_plus_expression + (tok, op1, op2, type_code, EXP_PLUS); } |expression tl_MINUS expression %prec tl_PLUS { - struct prod_token_parm_item* tok; - struct prod_token_parm_item *prod; - struct prod_token_parm_item *op1; - struct prod_token_parm_item *op2; - tree type; - - op1 = $1; - op2 = $3; - ensure_not_void (NUMERIC_TYPE (op1), op1->tp.pro.main_token); - ensure_not_void (NUMERIC_TYPE (op2), op2->tp.pro.main_token); - tok = $2; - prod = make_production (PROD_PLUS_EXPRESSION, tok); - NUMERIC_TYPE (prod) = get_common_type (op1, op2); - if (!NUMERIC_TYPE (prod)) + struct prod_token_parm_item *tok = $2; + struct prod_token_parm_item *op1 = $1; + struct prod_token_parm_item *op2 = $3; + int type_code = get_common_type (op1, op2); + if (!type_code) YYERROR; - else - { - type = get_type_for_numeric_type (NUMERIC_TYPE (prod)); - if (!type) - abort (); - OP1 (prod) = $1; - OP2 (prod) = $3; - - prod->tp.pro.code = tree_code_get_expression (EXP_MINUS, - type, op1->tp.pro.code, op2->tp.pro.code, NULL); - } - $$ = prod; + $$ = make_plus_expression + (tok, op1, op2, type_code, EXP_MINUS); } |expression EQUALS expression { - struct prod_token_parm_item* tok; - struct prod_token_parm_item *prod; - struct prod_token_parm_item *op1; - struct prod_token_parm_item *op2; - tree type; - - op1 = $1; - op2 = $3; - ensure_not_void (NUMERIC_TYPE (op1), op1->tp.pro.main_token); - ensure_not_void (NUMERIC_TYPE (op2), op2->tp.pro.main_token); - tok = $2; - prod = make_production (PROD_PLUS_EXPRESSION, tok); - NUMERIC_TYPE (prod) = SIGNED_INT; - if (!NUMERIC_TYPE (prod)) - YYERROR; - else - { - type = get_type_for_numeric_type (NUMERIC_TYPE (prod)); - if (!type) - abort (); - OP1 (prod) = $1; - OP2 (prod) = $3; - - prod->tp.pro.code = tree_code_get_expression (EXP_EQUALS, - type, op1->tp.pro.code, op2->tp.pro.code, NULL); - } - $$ = prod; + struct prod_token_parm_item *tok = $2; + struct prod_token_parm_item *op1 = $1; + struct prod_token_parm_item *op2 = $3; + $$ = make_plus_expression + (tok, op1, op2, SIGNED_INT, EXP_EQUALS); } |variable_ref ASSIGN expression { - struct prod_token_parm_item* tok; - struct prod_token_parm_item *prod; - struct prod_token_parm_item *op1; - struct prod_token_parm_item *op2; - tree type; - - op1 = $1; - op2 = $3; - tok = $2; - ensure_not_void (NUMERIC_TYPE (op2), op2->tp.pro.main_token); - prod = make_production (PROD_ASSIGN_EXPRESSION, tok); - NUMERIC_TYPE (prod) = NUMERIC_TYPE (op1); - if (!NUMERIC_TYPE (prod)) + struct prod_token_parm_item *tok = $2; + struct prod_token_parm_item *op1 = $1; + struct prod_token_parm_item *op2 = $3; + int type_code = NUMERIC_TYPE (op1); + if (!type_code) YYERROR; - else - { - type = get_type_for_numeric_type (NUMERIC_TYPE (prod)); - if (!type) - abort (); - OP1 (prod) = $1; - OP2 (prod) = $3; - prod->tp.pro.code = tree_code_get_expression (EXP_ASSIGN, - type, op1->tp.pro.code, op2->tp.pro.code, NULL); - } - $$ = prod; + $$ = make_plus_expression + (tok, op1, op2, type_code, EXP_ASSIGN); } |function_invocation { $$ = $1; @@ -973,6 +899,39 @@ make_integer_constant (struct prod_token_parm_item* value) return prod; } + +/* Build a PROD_PLUS_EXPRESSION. This is uses for PLUS, MINUS, ASSIGN + and EQUALS expressions. */ + +static struct prod_token_parm_item * +make_plus_expression (struct prod_token_parm_item* tok, + struct prod_token_parm_item* op1, + struct prod_token_parm_item* op2, + int type_code, int prod_code) +{ + struct prod_token_parm_item *prod; + tree type; + + ensure_not_void (NUMERIC_TYPE (op1), op1->tp.pro.main_token); + ensure_not_void (NUMERIC_TYPE (op2), op2->tp.pro.main_token); + + prod = make_production (PROD_PLUS_EXPRESSION, tok); + + NUMERIC_TYPE (prod) = type_code; + type = get_type_for_numeric_type (NUMERIC_TYPE (prod)); + if (!type) + abort (); + OP1 (prod) = op1; + OP2 (prod) = op2; + + prod->tp.pro.code = tree_code_get_expression + (prod_code, type, op1->tp.pro.code, + op2->tp.pro.code, NULL); + + return prod; +} + + /* Set STORAGE_CLASS in PROD according to CLASS_TOKEN. */ static void @@ -1011,3 +970,4 @@ treelang_debug (void) if (option_parser_trace) yydebug = 1; } + diff --git a/gcc/treelang/tree1.c b/gcc/treelang/tree1.c index e6f96d4..6333d0f 100644 --- a/gcc/treelang/tree1.c +++ b/gcc/treelang/tree1.c @@ -121,6 +121,8 @@ treelang_decode_option (num_options_left, first_option_left) fprintf (stdout, "Usage: tree1 [switches] -o output input\n"); return 1; } + break; + case 'v': if (!strcmp (first_option_left[0],"-v")) { @@ -133,6 +135,8 @@ treelang_decode_option (num_options_left, first_option_left) } return 1; } + break; + case 'y': if (!strcmp (first_option_left[0],"-y")) { @@ -140,6 +144,8 @@ treelang_decode_option (num_options_left, first_option_left) option_parser_trace = 1; return 1; } + break; + case 'f': if (!strcmp (first_option_left[0],"-fparser-trace")) { @@ -151,7 +157,7 @@ treelang_decode_option (num_options_left, first_option_left) option_lexer_trace = 1; return 1; } - return 0; + break; case 'w': if (!strcmp (first_option_left[0],"-w")) @@ -160,21 +166,20 @@ treelang_decode_option (num_options_left, first_option_left) all warnings. */ return 1; } - return 0; + break; case 'W': if (!strcmp (first_option_left[0],"-Wall")) { return 1; } - return 0; + break; default: - return 0; + break; } return 0; - } /* Language dependent parser setup. */ |