[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/8] simplify the handling of <> and <*>'s code_props.
From: |
Akim Demaille |
Subject: |
[PATCH 2/8] simplify the handling of <> and <*>'s code_props. |
Date: |
Mon, 23 Jul 2012 14:06:01 +0200 |
Currently they are treated in separated variables, contrary to other
<TYPE> code_props. This duplicates code (and messages for translators)
uselessly, as demonstrated by the fact that thanks to this patch, now
useless <*> and <> code_props are reported like the others.
* src/parse-gram.y (generic_symlist_item): Treat "<*>" and "<>" as regular
type tags.
* src/symlist.h, src/symlist.c (symbol_list_default_tagged_new)
(symbol_list_default_tagless_new,SYMLIST_DEFAULT_TAGGED)
(SYMLIST_DEFAULT_TAGLESS): Remove.
* src/symtab.h, src/symtab.c (default_tagged_code_props)
(default_tagless_code_props, default_tagged_code_props_set)
(default_tagless_code_props_set): Remove.
(symbol_code_props_get): Default to <*> or <>'s code_props.
* tests/actions.at: Complete expected errors: there are new warnings.
* tests/input.at: Likewise.
(Useless printers or destructors): Extend.
---
src/parse-gram.y | 4 ++--
src/symlist.c | 42 ------------------------------------
src/symlist.h | 9 ++------
src/symtab.c | 66 +++++++++++---------------------------------------------
src/symtab.h | 12 -----------
tests/actions.at | 49 ++++++++++++++++++++++++++++++-----------
tests/input.at | 60 ++++++++++++++++++++++++++++++++++-----------------
7 files changed, 93 insertions(+), 149 deletions(-)
diff --git a/src/parse-gram.y b/src/parse-gram.y
index d1f6675..5c70208 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -523,8 +523,8 @@ generic_symlist:
generic_symlist_item:
symbol { $$ = symbol_list_sym_new ($1, @1); }
| TAG { $$ = symbol_list_type_new ($1, @1); }
-| "<*>" { $$ = symbol_list_default_tagged_new (@1); }
-| "<>" { $$ = symbol_list_default_tagless_new (@1); }
+| "<*>" { $$ = symbol_list_type_new ("*", @1); }
+| "<>" { $$ = symbol_list_type_new ("", @1); }
;
/* One token definition. */
diff --git a/src/symlist.c b/src/symlist.c
index 1fbc5cb..bd9f3c2 100644
--- a/src/symlist.c
+++ b/src/symlist.c
@@ -78,42 +78,6 @@ symbol_list_type_new (uniqstr type_name, location loc)
}
-/*----------------------------------------.
-| Create a list containing a <*> at LOC. |
-`----------------------------------------*/
-
-symbol_list *
-symbol_list_default_tagged_new (location loc)
-{
- symbol_list *res = xmalloc (sizeof *res);
-
- res->content_type = SYMLIST_DEFAULT_TAGGED;
- res->location = res->sym_loc = loc;
- res->named_ref = NULL;
- res->next = NULL;
-
- return res;
-}
-
-
-/*---------------------------------------.
-| Create a list containing a <> at LOC. |
-`---------------------------------------*/
-
-symbol_list *
-symbol_list_default_tagless_new (location loc)
-{
- symbol_list *res = xmalloc (sizeof *res);
-
- res->content_type = SYMLIST_DEFAULT_TAGLESS;
- res->location = res->sym_loc = loc;
- res->named_ref = NULL;
- res->next = NULL;
-
- return res;
-}
-
-
/*-----------------------------------------------------------------------.
| Print this list, for which every content_type must be SYMLIST_SYMBOL. |
`-----------------------------------------------------------------------*/
@@ -247,11 +211,5 @@ symbol_list_code_props_set (symbol_list *node,
code_props_type kind,
if (node->content.sem_type->status == undeclared)
node->content.sem_type->status = used;
break;
- case SYMLIST_DEFAULT_TAGGED:
- default_tagged_code_props_set (kind, &cprops);
- break;
- case SYMLIST_DEFAULT_TAGLESS:
- default_tagless_code_props_set (kind, &cprops);
- break;
}
}
diff --git a/src/symlist.h b/src/symlist.h
index 3b03713..dd63408 100644
--- a/src/symlist.h
+++ b/src/symlist.h
@@ -34,8 +34,8 @@ typedef struct symbol_list
* \c <>.
*/
enum {
- SYMLIST_SYMBOL, SYMLIST_TYPE,
- SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
+ SYMLIST_SYMBOL,
+ SYMLIST_TYPE
} content_type;
union {
/**
@@ -88,11 +88,6 @@ symbol_list *symbol_list_sym_new (symbol *sym, location loc);
/** Create a list containing \c type_name at \c loc. */
symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
-/** Create a list containing a \c <*> at \c loc. */
-symbol_list *symbol_list_default_tagged_new (location loc);
-/** Create a list containing a \c <> at \c loc. */
-symbol_list *symbol_list_default_tagless_new (location loc);
-
/** Print this list.
\pre For every node \c n in the list, <tt>n->content_type =
diff --git a/src/symtab.c b/src/symtab.c
index a502dfd..68c33c7 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -46,20 +46,6 @@ symbol *accept = NULL;
symbol *startsymbol = NULL;
location startsymbol_location;
-/*---------------------------------------.
-| Default %destructor's and %printer's. |
-`---------------------------------------*/
-
-static code_props default_tagged_code_props[CODE_PROPS_SIZE] =
- {
- CODE_PROPS_NONE_INIT,
- CODE_PROPS_NONE_INIT,
- };
-static code_props default_tagless_code_props[CODE_PROPS_SIZE] =
- {
- CODE_PROPS_NONE_INIT,
- CODE_PROPS_NONE_INIT,
- };
/*---------------------------------.
| Create a new symbol, named TAG. |
@@ -291,12 +277,14 @@ symbol_code_props_get (symbol *sym, code_props_type kind)
}
/* Apply default code props's only to user-defined symbols. */
- if (sym->tag[0] == '$' || sym == errtoken)
- return &code_props_none;
-
- if (sym->type_name)
- return &default_tagged_code_props[kind];
- return &default_tagless_code_props[kind];
+ if (sym->tag[0] != '$' && sym != errtoken)
+ {
+ code_props *code =
+ &semantic_type_get (sym->type_name ? "*" : "", NULL)->props[kind];
+ if (code->code)
+ return code;
+ }
+ return &code_props_none;
}
/*-----------------------------------------------------------------.
@@ -437,7 +425,10 @@ symbol_check_defined (symbol *sym)
static inline bool
semantic_type_check_defined (semantic_type *sem_type)
{
- if (sem_type->status == declared)
+ // <*> and <> do not have to be "declared".
+ if (sem_type->status == declared
+ || !*sem_type->tag
+ || STREQ(sem_type->tag, "*"))
{
for (int i = 0; i < 2; ++i)
if (sem_type->props[i].kind != CODE_PROPS_NONE
@@ -970,36 +961,3 @@ symbols_pack (void)
_("the start symbol %s is a token"),
startsymbol->tag);
}
-
-
-/*--------------------------------------------------.
-| Set default tagged/tagless %destructor/%printer. |
-`--------------------------------------------------*/
-
-void
-default_tagged_code_props_set (code_props_type kind, code_props const *code)
-{
- if (default_tagged_code_props[kind].code)
- {
- complain_at (code->location, complaint,
- _("redeclaration for default tagged %s"),
- code_props_type_string (kind));
- complain_at (default_tagged_code_props[kind].location, complaint,
- _("previous declaration"));
- }
- default_tagged_code_props[kind] = *code;
-}
-
-void
-default_tagless_code_props_set (code_props_type kind, code_props const *code)
-{
- if (default_tagless_code_props[kind].code)
- {
- complain_at (code->location, complaint,
- _("redeclaration for default tagless %s"),
- code_props_type_string (kind));
- complain_at (default_tagless_code_props[kind].location, complaint,
- _("previous declaration"));
- }
- default_tagless_code_props[kind] = *code;
-}
diff --git a/src/symtab.h b/src/symtab.h
index 31c4696..9377800 100644
--- a/src/symtab.h
+++ b/src/symtab.h
@@ -277,16 +277,4 @@ void symbols_check_defined (void);
#token_translations. */
void symbols_pack (void);
-
-/*---------------------------------------.
-| Default %destructor's and %printer's. |
-`---------------------------------------*/
-
-/** Set the default \c \%destructor or \c \%printer for tagged values. */
-void default_tagged_code_props_set (code_props_type kind,
- code_props const *code);
-/** Set the default \c \%destructor or \c \%printer for tagless values. */
-void default_tagless_code_props_set (code_props_type kind,
- code_props const *destructor);
-
#endif /* !SYMTAB_H_ */
diff --git a/tests/actions.at b/tests/actions.at
index a14f522..120c401 100644
--- a/tests/actions.at
+++ b/tests/actions.at
@@ -1,4 +1,4 @@
-# Executing Actions. -*- Autotest -*-
+e# Executing Actions. -*- Autotest -*-
# Copyright (C) 2001-2012 Free Software Foundation, Inc.
@@ -646,7 +646,10 @@ main (void)
}
]])
-AT_BISON_CHECK([-o input.c input.y])
+AT_BISON_CHECK([-o input.c input.y], [], [],
+[[input.y:27.3-5: warning: useless %destructor for type <*> [-Wother]
+input.y:27.3-5: warning: useless %printer for type <*> [-Wother]
+]])
AT_COMPILE([input])
AT_PARSER_CHECK([./input], 1,
[[<> destructor for 'd' @ 4.
@@ -758,7 +761,10 @@ main (void)
}
]])
-AT_BISON_CHECK([-o input.c input.y])
+AT_BISON_CHECK([-o input.c input.y], [], [],
+[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother]
+input.y:22.3-4: warning: useless %printer for type <> [-Wother]
+]])
AT_COMPILE([input])
AT_PARSER_CHECK([./input], 1,
[[<*>/<field2>/e destructor.
@@ -817,9 +823,9 @@ AT_CLEANUP
AT_SETUP([Default %printer and %destructor for user-defined end token])
-# _AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(TYPED)
-# -------------------------------------------------------------
-m4_define([_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN],
+# AT_TEST(TYPED)
+# --------------
+m4_pushdef([AT_TEST],
[m4_if($1, 0,
[m4_pushdef([kind], []) m4_pushdef([not_kind], [*])],
[m4_pushdef([kind], [*]) m4_pushdef([not_kind], [])])
@@ -891,8 +897,17 @@ main (void)
]])
AT_BISON_OPTION_POPDEFS
-AT_BISON_CHECK([-o input$1.c input$1.y])
+AT_BISON_CHECK([-o input$1.c input$1.y], [], [],
+[m4_if([$1], [0],
+[[input0.y:27.3-5: warning: useless %destructor for type <*> [-Wother]
+input0.y:27.3-5: warning: useless %printer for type <*> [-Wother]
+]],
+[[input1.y:27.3-4: warning: useless %destructor for type <> [-Wother]
+input1.y:27.3-4: warning: useless %printer for type <> [-Wother]
+]])])
+
AT_COMPILE([input$1])
+
AT_PARSER_CHECK([./input$1], 0,
[[<]]kind[[> for 'E' @ 1.
<]]kind[[> for 'S' @ 1.
@@ -915,8 +930,10 @@ m4_popdef([kind])
m4_popdef([not_kind])
])
-_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(0)
-_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(1)
+AT_TEST(0)
+AT_TEST(1)
+
+m4_popdef([AT_TEST])
AT_CLEANUP
@@ -976,7 +993,10 @@ main (void)
]])
AT_BISON_OPTION_POPDEFS
-AT_BISON_CHECK([-o input.c input.y])
+AT_BISON_CHECK([-o input.c input.y], [], [],
+[[input.y:21.6-8: warning: useless %destructor for type <*> [-Wother]
+input.y:21.6-8: warning: useless %printer for type <*> [-Wother]
+]])
AT_COMPILE([input])
AT_PARSER_CHECK([./input], [1], [],
[[Starting parse
@@ -1075,7 +1095,10 @@ main (void)
]])
AT_BISON_OPTION_POPDEFS
-AT_BISON_CHECK([-o input.c input.y])
+AT_BISON_CHECK([-o input.c input.y], [], [],
+[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother]
+input.y:22.3-4: warning: useless %printer for type <> [-Wother]
+]])
AT_COMPILE([input])
AT_CLEANUP
@@ -1132,7 +1155,9 @@ main (void)
AT_BISON_OPTION_POPDEFS
AT_BISON_CHECK([-o input.c input.y], 0,,
-[[input.y:33.3-23: warning: unset value: $$ [-Wother]
+[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother]
+input.y:24.70-72: warning: useless %printer for type <*> [-Wother]
+input.y:33.3-23: warning: unset value: $$ [-Wother]
input.y:30.3-35.37: warning: unused value: $3 [-Wother]
]])
diff --git a/tests/input.at b/tests/input.at
index 694adf3..71505cf 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -200,29 +200,29 @@ start: ;
]])
AT_BISON_CHECK([input.y], [1], [],
-[[input.y:1.13-29: redeclaration for default tagged %destructor
+[[input.y:1.13-29: %destructor redeclaration for <*>
input.y:1.13-29: previous declaration
-input.y:2.10-24: redeclaration for default tagged %printer
+input.y:2.10-24: %printer redeclaration for <*>
input.y:2.10-24: previous declaration
-input.y:4.13-29: redeclaration for default tagged %destructor
+input.y:4.13-29: %destructor redeclaration for <*>
input.y:1.13-29: previous declaration
-input.y:5.10-24: redeclaration for default tagged %printer
+input.y:5.10-24: %printer redeclaration for <*>
input.y:2.10-24: previous declaration
-input.y:7.13-29: redeclaration for default tagless %destructor
+input.y:7.13-29: %destructor redeclaration for <>
input.y:7.13-29: previous declaration
-input.y:8.10-24: redeclaration for default tagless %printer
+input.y:8.10-24: %printer redeclaration for <>
input.y:8.10-24: previous declaration
-input.y:10.13-29: redeclaration for default tagless %destructor
+input.y:10.13-29: %destructor redeclaration for <>
input.y:7.13-29: previous declaration
-input.y:11.10-24: redeclaration for default tagless %printer
+input.y:11.10-24: %printer redeclaration for <>
input.y:8.10-24: previous declaration
-input.y:17.13-29: redeclaration for default tagged %destructor
+input.y:17.13-29: %destructor redeclaration for <*>
input.y:4.13-29: previous declaration
-input.y:18.10-24: redeclaration for default tagged %printer
+input.y:18.10-24: %printer redeclaration for <*>
input.y:5.10-24: previous declaration
-input.y:20.13-29: redeclaration for default tagless %destructor
+input.y:20.13-29: %destructor redeclaration for <>
input.y:10.13-29: previous declaration
-input.y:21.10-24: redeclaration for default tagless %printer
+input.y:21.10-24: %printer redeclaration for <>
input.y:11.10-24: previous declaration
]])
@@ -329,8 +329,16 @@ AT_CLEANUP
AT_SETUP([Useless printers or destructors])
-AT_DATA([[input.y]],
-[[%token <type1> token1
+# AT_TEST([INPUT], [STDERR])
+# --------------------------
+m4_pushdef([AT_TEST],
+[AT_DATA([[input.y]],
+[$1
+])
+AT_BISON_CHECK([input.y], [0], [], [$2
+])])
+
+AT_TEST([[%token <type1> token1
%token <type2> token2
%token <type3> token3
%token <type4> token4
@@ -356,14 +364,26 @@ AT_DATA([[input.y]],
%destructor {} <type7>
%%
-exp: "a";
-]])
-
-AT_BISON_CHECK([input.y], [0], [],
+exp: "a";]],
[[input.y:16.13-19: warning: useless %printer for type <type1> [-Wother]
-input.y:17.16-22: warning: useless %destructor for type <type2> [-Wother]
-]])
+input.y:17.16-22: warning: useless %destructor for type <type2> [-Wother]]])
+
+# If everybody is typed, <> is useless.
+AT_TEST([[%type <type> exp
+%token <type> a
+%printer {} <> <*>
+%%
+exp: a;]],
+[[input.y:3.13-14: warning: useless %printer for type <> [-Wother]]])
+# If nobody is is typed, <*> is useless.
+AT_TEST([[%token a
+%printer {} <> <*>
+%%
+exp: a;]],
+[[input.y:2.16-18: warning: useless %printer for type <*> [-Wother]]])
+
+m4_popdef([AT_TEST])
AT_CLEANUP
--
1.7.11.2
- [PATCH 0/8] {maint} factor %printer and %destructor, Akim Demaille, 2012/07/23
- [PATCH 5/8] parser: factor the handling of code_props, Akim Demaille, 2012/07/23
- [PATCH 3/8] regen., Akim Demaille, 2012/07/23
- [PATCH 1/8] allow modification on retrieved code_props., Akim Demaille, 2012/07/23
- [PATCH 6/8] parser: fix %printer usage., Akim Demaille, 2012/07/23
- [PATCH 4/8] parser: factor handling of type tags, Akim Demaille, 2012/07/23
- [PATCH 7/8] space changes., Akim Demaille, 2012/07/23
- [PATCH 2/8] simplify the handling of <> and <*>'s code_props.,
Akim Demaille <=
- [PATCH 8/8] regen., Akim Demaille, 2012/07/23