1 
2 /******************************************************************************
3 * MODULE     : drd_info.hpp
4 * DESCRIPTION: data relation descriptions
5 * COPYRIGHT  : (C) 2003  Joris van der Hoeven
6 *******************************************************************************
7 * This software falls under the GNU general public license version 3 or later.
8 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
9 * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
10 ******************************************************************************/
11 
12 #ifndef DRD_INFO_H
13 #define DRD_INFO_H
14 #include "tree.hpp"
15 #include "rel_hashmap.hpp"
16 #include "tag_info.hpp"
17 
18 class drd_info;
19 class drd_info_rep: concrete_struct {
20 public:
21   string name;
22   rel_hashmap<tree_label,tag_info> info;
23   hashmap<string,tree> env;
24 
25 public:
26   drd_info_rep (string name);
27   drd_info_rep (string name, drd_info base);
28   tree get_locals ();
29   bool set_locals (tree t);
30   bool contains (string l);
31 
32   /* Properties of the tag itself */
33   void set_type (tree_label tag, int tp);
34   int  get_type (tree_label tag);
35   void freeze_type (tree_label tag);
36   int  get_type (tree t);
37 
38   void set_arity (tree_label tag, int arity, int extra, int am, int cm);
39   int  get_arity_mode (tree_label tag);
40   int  get_arity_base (tree_label tag);
41   int  get_arity_extra (tree_label tag);
42   int  get_child_mode (tree_label tag);
43   int  get_nr_indices (tree_label tag);
44   void freeze_arity (tree_label tag);
45   int  get_old_arity (tree_label l);
46   int  get_minimal_arity (tree_label l);
47   int  get_maximal_arity (tree_label l);
48   bool correct_arity (tree_label l, int i);
49   bool insert_point (tree_label l, int i, int n);
50   bool is_dynamic (tree t, bool hack= true);
51 
52   void set_border (tree_label tag, int mode);
53   int  get_border (tree_label tag);
54   void freeze_border (tree_label tag);
55   bool is_child_enforcing (tree t);
56   bool is_parent_enforcing (tree t);
57   bool var_without_border (tree_label tag);
58 
59   void set_block (tree_label tag, int is_block);
60   int  get_block (tree_label tag);
61   void freeze_block (tree_label tag);
62 
63   void set_with_like (tree_label tag, bool is_with_like);
64   bool get_with_like (tree_label tag);
65   void freeze_with_like (tree_label tag);
66   bool is_with_like (tree t);
67 
68   void set_var_type (tree_label tag, int vt);
69   int  get_var_type (tree_label tag);
70   void freeze_var_type (tree_label tag);
71 
72   void set_attribute (tree_label tag, string which, tree val);
73   tree get_attribute (tree_label tag, string which);
74   void set_name (tree_label tag, string val);
75   void set_long_name (tree_label tag, string val);
76   void set_syntax (tree_label tag, tree val);
77   string get_name (tree_label tag);
78   string get_long_name (tree_label tag);
79   tree   get_syntax (tree_label tag);
80   tree   get_syntax (tree t, path p= path (-1));
81 
82   /* Properties of the children of the tag */
83   void set_type (tree_label tag, int nr, int tp);
84   int  get_type (tree_label tag, int nr);
85   void freeze_type (tree_label tag, int nr);
86   int  get_type_child (tree t, int child);
87 
88   void set_accessible (tree_label tag, int nr, int access_mode);
89   int  get_accessible (tree_label tag, int nr);
90   void freeze_accessible (tree_label tag, int nr);
91   bool all_accessible (tree_label tag);
92   bool none_accessible (tree_label tag);
93   bool is_accessible_child (tree t, int child);
94   bool is_accessible_path (tree t, path p);
95 
96   void set_writability (tree_label tag, int nr, int writability);
97   int  get_writability (tree_label tag, int nr);
98   void freeze_writability (tree_label tag, int nr);
99   int  get_writability_child (tree t, int child);
100 
101   void set_block (tree_label tag, int nr, int require_block);
102   int  get_block (tree_label tag, int nr);
103   void freeze_block (tree_label tag, int nr);
104 
105   void set_env (tree_label tag, int nr, tree env);
106   tree get_env (tree_label tag, int nr);
107   void freeze_env (tree_label tag, int nr);
108   tree get_env_child (tree t, int child, tree env);
109   tree get_env_child (tree t, int child, string var, tree val);
110   tree get_env_descendant (tree t, path p, tree env);
111 
112   void set_child_name (tree_label tag, int nr, string val);
113   void set_child_long_name (tree_label tag, int nr, string val);
114   string get_child_name (tree_label tag, int nr);
115   string get_child_long_name (tree_label tag, int nr);
116   string get_child_name (tree t, int child);
117   string get_child_long_name (tree t, int child);
118 
119   /* Heuristic initialization */
120   void set_environment (hashmap<string,tree> env);
121   tree arg_access (tree t, tree arg, tree env, int& type);
122   bool heuristic_with_like (tree t, tree arg);
123   bool heuristic_init_macro (string var, tree macro);
124   bool heuristic_init_xmacro (string var, tree xmacro);
125   bool heuristic_init_parameter (string var, string val);
126   bool heuristic_init_parameter (string var, tree val);
127   void heuristic_init (hashmap<string,tree> env);
128 
129   friend class drd_info;
130   friend tm_ostream& operator << (tm_ostream& out, drd_info drd);
131 };
132 
133 class drd_info {
134   CONCRETE(drd_info);
135   drd_info (string name);
136   drd_info (string name, drd_info base);
137   operator tree ();
138 };
139 CONCRETE_CODE(drd_info);
140 
141 tree drd_env_write (tree env, string var, tree val);
142 tree drd_env_merge (tree env, tree t);
143 tree drd_env_read (tree env, string var, tree val= tree (UNINIT));
144 
145 #endif // defined DRD_INFO_H
146