1 ///////////////////////////////////////////////////////////////////////////////
3 // This file contains the definitions used in the parser generator
4 // and meta syntax compiler.
6 ///////////////////////////////////////////////////////////////////////////////
7 #ifndef parser_generator_h
8 #define parser_generator_h
10 #include <AD/automata/grammar.h>
16 ///////////////////////////////////////////////////////////////////////////////
18 // Forward declarations
20 ///////////////////////////////////////////////////////////////////////////////
21 class Grammar; // grammar class
22 class LALR1Gen; // lalr1 parser class
23 class OpPrecedence; // operator precedence class
27 ///////////////////////////////////////////////////////////////////////////////
29 // Parametric grammar expression.
31 ///////////////////////////////////////////////////////////////////////////////
33 = EXPgram (List<PrecRule>, ShiftReduceErrors, List<BNF>)
34 // a grammar expresson
35 | POLYgram (int, Id [], GramExp) // polymorphic scheme
36 | UNIONgram (GramExp, GramExp) // union
37 | RESTRICTgram (GramExp) // restriction
38 | APPgram (GramExp, GramExp) // application
40 ///////////////////////////////////////////////////////////////////////////////
44 ///////////////////////////////////////////////////////////////////////////////
45 and BNF : Loc = BNFrule (Id, Ty, List<ProductionSymbols>)
47 ///////////////////////////////////////////////////////////////////////////////
51 ///////////////////////////////////////////////////////////////////////////////
52 and PrecRule : Loc = PRECrule (PrecMode, int, ProductionSymbols)
54 ///////////////////////////////////////////////////////////////////////////////
56 // Operator association
58 ///////////////////////////////////////////////////////////////////////////////
59 and PrecMode = LEFTassoc | RIGHTassoc | NONassoc
61 ///////////////////////////////////////////////////////////////////////////////
65 ///////////////////////////////////////////////////////////////////////////////
66 where type ProductionSymbols = List<ProductionSymbol>
67 and PrecRules = List<PrecRule>
69 and GramExps = List<GramExp>
70 and ShiftReduceErrors = int
73 ///////////////////////////////////////////////////////////////////////////////
75 // Pretty printing methods.
77 ///////////////////////////////////////////////////////////////////////////////
78 extern std::ostream& operator << (std::ostream&, ProductionSymbol);
79 extern std::ostream& operator << (std::ostream&, ProductionSymbols);
80 extern std::ostream& operator << (std::ostream&, PrecRule);
81 extern std::ostream& operator << (std::ostream&, PrecRules);
82 extern std::ostream& operator << (std::ostream&, BNF);
83 extern std::ostream& operator << (std::ostream&, BNFs);
84 extern std::ostream& operator << (std::ostream&, GramExp);
85 extern std::ostream& operator << (std::ostream&, GramExps);
87 ///////////////////////////////////////////////////////////////////////////////
89 // Class to represent a syntax class
91 ///////////////////////////////////////////////////////////////////////////////
92 class SyntaxClass : public ClassDefinition
93 { SyntaxClass(const SyntaxClass&);
94 void operator = (const SyntaxClass&);
98 typedef Grammar::Terminal Terminal;
99 typedef Grammar::NonTerminal NonTerminal;
100 typedef Grammar::Action Action;
101 typedef Grammar::Production Production;
105 ////////////////////////////////////////////////////////////////////////////
107 // Internal data for generating a parser
109 ////////////////////////////////////////////////////////////////////////////
110 BNFs production_rules; // production rules
111 PrecRules precedence_rules; // precedence rules
112 Production * productions; // products array
113 Grammar * G; // Grammar object
114 LALR1Gen * parserGen; // Parser generator object
115 OpPrecedence * prec; // operator precedence object
116 int number_of_productions; // Number of productions
117 HashTable nonterm_map; // map nonterm -> Nonterminal
118 HashTable action_map; // map Action -> Decls
119 HashTable inner_action_map; //
120 HashTable line_map; // map Action -> line#
121 HashTable predicate_map; // ??
122 Terminal min_term; // min Terminal #
123 Terminal max_term; // max Terminal #
124 Terminal error_term; // error Terminal #
125 NonTerminal max_nonterm; // max NonTerminal #
126 NonTerminal start_symbol; // start symbol of grammar
127 Action min_action; // min Action #
128 Id * symbol_names; // map NonTerminal -> Id
129 Ty * ty_map; // map NonTerminal -> Ty
133 SyntaxClass(CLASS_TYPE, Id, Inherits, TyQual, Decls);
136 ////////////////////////////////////////////////////////////////////////////
138 // Methods to generate a syntax class
140 ////////////////////////////////////////////////////////////////////////////
141 virtual void gen_parser (CodeGen&, GramExp);
142 virtual void gen_class_interface(CodeGen&);
143 virtual void gen_class_implementation(CodeGen&, Tys, DefKind);
146 // compile a set of rules
147 virtual void compile_rules (CodeGen&, PrecRules, ShiftReduceErrors, BNFs);
148 // compile a grammar expression
149 virtual void compile_grammar (CodeGen&, GramExp);
151 // Various phases of the compilation process
154 void preprocess_grammar();
155 void translate_into_grammar();
156 void define_operator_precedence();
157 void process_parser_errors(ShiftReduceErrors);
159 // Various phases of the code generation process
160 void generate_semantic_stack_definition(CodeGen&);
161 void generate_semantic_stack_growth(CodeGen&);
162 void generate_semantic_stack_adjustment(CodeGen&);
163 void generate_debugging_tables(CodeGen&);
164 void generate_parse_method(CodeGen&);
165 void generate_parser_tables(CodeGen&);
166 void generate_action_driver(CodeGen&);
167 virtual void generate_semantic_actions(CodeGen&);
169 virtual void gen_class_constructor_initializers(CodeGen&, Tys, DefKind);
172 ///////////////////////////////////////////////////////////////////////////////
174 // Definition of the parser generator
176 ///////////////////////////////////////////////////////////////////////////////
177 class ParserCompiler : virtual public CodeGen {
179 ParserCompiler(const ParserCompiler&); // no copy constructor
180 void operator = (const ParserCompiler&); // no assignment
186 ////////////////////////////////////////////////////////////////////////////
187 // Method to generate a syntax class
188 ////////////////////////////////////////////////////////////////////////////
189 virtual void gen_parser (Id, GramExp);