cymoca
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
compiler.h
Go to the documentation of this file.
1 #ifndef CYMOCA_COMPILER_H_
2 #define CYMOCA_COMPILER_H_
3 
4 #include <memory>
5 #include <ostream>
6 #include <unordered_map>
7 #include "ast/ast.h"
8 #include "util.h"
9 
10 #include <modelica_antlr/ModelicaBaseListener.h>
11 #include <modelica_antlr/ModelicaLexer.h>
12 
13 using namespace modelica_antlr;
14 
15 namespace cymoca {
16 
17 class CompilerException : public std::runtime_error {
18  std::string msg{};
19 
20  public:
21  CompilerException(const std::string &arg, const char *file, int line)
22  : std::runtime_error(arg) {
23  std::ostringstream o;
24  o << file << ":" << line << ": " << arg;
25  msg = o.str();
26  }
27  ~CompilerException() throw() {}
28  const char *what() const throw() { return msg.c_str(); }
29 };
30 #define compiler_exception(arg) CompilerException(arg, __FILE__, __LINE__);
31 
35 class Compiler : public ModelicaBaseListener {
36  public:
37  explicit Compiler(std::ifstream &text);
38  ModelicaParser &getParser() { return *m_parser; }
39  antlr4::CommonTokenStream &getTokenStream() { return m_token_stream; }
40  ast::model::Class *root() { return m_root; }
41  Compiler(const Compiler &) = delete;
42  Compiler &operator=(const Compiler &) = delete;
43  using AstMap = std::unordered_map<antlr4::ParserRuleContext *,
44  std::unique_ptr<ast::INode>>;
45 
46  protected:
47  std::unique_ptr<ModelicaParser> m_parser;
48  antlr4::ANTLRInputStream m_input;
49  ModelicaLexer m_lexer;
50  antlr4::CommonTokenStream m_token_stream;
51  ast::model::Class *m_root{nullptr};
52  bool m_verbose;
54 
59  template <typename T>
60  T *getAst(antlr4::ParserRuleContext *ctx) {
61  auto iter = m_ast.find(ctx);
62  assert(iter != m_ast.end());
63  auto p = dynamic_cast<T *>(iter->second.get());
64  assert(p);
65  return p;
66  }
67 
73  template <typename T>
74  std::unique_ptr<T> moveAst(antlr4::ParserRuleContext *ctx) {
75  auto iter = m_ast.find(ctx);
76  assert(iter != m_ast.end());
77  auto p = static_unique_ptr_cast<T>(std::move(iter->second));
78  assert(p);
79  return p;
80  }
81 
86  template <typename T>
87  std::unique_ptr<T> cloneAst(antlr4::ParserRuleContext *ctx) {
88  auto iter = m_ast.find(ctx);
89  assert(iter != m_ast.end());
90  return iter->second->cloneAs<T>();
91  }
92 
93  void setAst(antlr4::ParserRuleContext *ctx,
94  std::unique_ptr<ast::INode> node) {
95  auto iter = m_ast.find(ctx);
96  (void)iter; // avoid unused warning when assertions removed
97  assert(node != nullptr);
98  assert(iter == m_ast.end());
99  m_ast[ctx] = std::move(node);
100  }
101 
102  void linkAst(antlr4::ParserRuleContext *to, antlr4::ParserRuleContext *from) {
103  auto iter = m_ast.find(from);
104  assert(iter != m_ast.end());
105  setAst(to, std::move(iter->second));
106  }
107 
112  std::string indent(int n);
113 
117  public:
118  void visitTerminal(antlr4::tree::TerminalNode *node) override;
119  void visitErrorNode(antlr4::tree::ErrorNode *node) override;
120  void enterEveryRule(antlr4::ParserRuleContext *ctx) override;
121  void exitEveryRule(antlr4::ParserRuleContext *ctx) override;
122 
123  // model
124 
125  // conditions
126  void exitCond_bool(ModelicaParser::Cond_boolContext *ctx) override;
127  void exitCond_binary(ModelicaParser::Cond_binaryContext *ctx) override;
128  void exitCond_unary(ModelicaParser::Cond_unaryContext *ctx) override;
129  void exitCond_compare(ModelicaParser::Cond_compareContext *ctx) override;
130  void exitCond_func(ModelicaParser::Cond_funcContext *ctx) override;
131  void exitCond_ref(ModelicaParser::Cond_refContext *ctx) override;
132 
133  // equations
134  void exitEq_simple(ModelicaParser::Eq_simpleContext *ctx) override;
135  void exitEq_block(ModelicaParser::Eq_blockContext *ctx) override;
136  void exitEq_if(ModelicaParser::Eq_ifContext *ctx) override;
137  void exitEq_for(ModelicaParser::Eq_forContext *ctx) override;
138  void exitEq_connect(ModelicaParser::Eq_connectContext *ctx) override;
139  void exitEq_when(ModelicaParser::Eq_whenContext *ctx) override;
140  void exitEq_func(ModelicaParser::Eq_funcContext *ctx) override;
141 
142  // statements
143  void exitStmt_ref(ModelicaParser::Stmt_refContext *ctx) override;
144  void exitStmt_func(ModelicaParser::Stmt_funcContext *ctx) override;
145  void exitStmt_key(ModelicaParser::Stmt_keyContext *ctx) override;
146  void exitStmt_if(ModelicaParser::Stmt_ifContext *ctx) override;
147  void exitStmt_for(ModelicaParser::Stmt_forContext *ctx) override;
148  void exitStmt_while(ModelicaParser::Stmt_whileContext *ctx) override;
149  void exitStmt_when(ModelicaParser::Stmt_whenContext *ctx) override;
150  void exitFor_indices(ModelicaParser::For_indicesContext *ctx) override;
151  void exitFor_index(ModelicaParser::For_indexContext *ctx) override;
152 
153  // expressions
154  void exitExpr_number(ModelicaParser::Expr_numberContext *ctx) override;
155  void exitExpr_ref(ModelicaParser::Expr_refContext *ctx) override;
156  void exitExpr_simple(ModelicaParser::Expr_simpleContext *ctx) override;
157  void exitExpr_if(ModelicaParser::Expr_ifContext *ctx) override;
158  void exitExpr_func(ModelicaParser::Expr_funcContext *ctx) override;
159  void exitExpr_string(ModelicaParser::Expr_stringContext *ctx) override;
160  void exitExpr_range(ModelicaParser::Expr_rangeContext *ctx) override;
161  void exitExpr_unary(ModelicaParser::Expr_unaryContext *ctx) override;
162  void exitExpr_binary(ModelicaParser::Expr_binaryContext *ctx) override;
163  void exitExpr_output(ModelicaParser::Expr_outputContext *ctx) override;
164  void exitExpr_list(ModelicaParser::Expr_listContext *ctx) override;
165  void exitExpr_end(ModelicaParser::Expr_endContext *ctx) override;
166  void exitExpr_array(ModelicaParser::Expr_arrayContext *ctx) override;
167 
168  // function arguments
169  void exitFunction_call_args(
170  ModelicaParser::Function_call_argsContext *ctx) override;
171  void exitFunc_arg_expr(ModelicaParser::Func_arg_exprContext *ctx) override;
172  void exitFunc_arg_for(ModelicaParser::Func_arg_forContext *ctx) override;
173  void exitFunc_arg_func(ModelicaParser::Func_arg_funcContext *ctx) override;
174  void exitFunc_arg_named(ModelicaParser::Func_arg_namedContext *ctx) override;
175 
176  // elements
177  void exitElem_import(ModelicaParser::Elem_importContext *ctx) override;
178  void exitElem_extends(ModelicaParser::Elem_extendsContext *ctx) override;
179  void exitElem_class(ModelicaParser::Elem_classContext *ctx) override;
180  void exitElem_comp(ModelicaParser::Elem_compContext *ctx) override;
181 
182  // misc
183  void exitClass_prefixes(ModelicaParser::Class_prefixesContext *ctx) override;
184  void exitStored_definition(
185  ModelicaParser::Stored_definitionContext *ctx) override;
186  void exitEnumeration_literal(
187  ModelicaParser::Enumeration_literalContext *ctx) override;
188  void exitComposition(ModelicaParser::CompositionContext *ctx) override;
189  void exitExternal_function_call(
190  ModelicaParser::External_function_callContext *ctx) override;
191  void exitConstraining_clause(
192  ModelicaParser::Constraining_clauseContext *ctx) override;
193  void exitComponent_clause(
194  ModelicaParser::Component_clauseContext *ctx) override;
195  void exitType_prefix(ModelicaParser::Type_prefixContext *ctx) override;
196  void exitComponent_declaration(
197  ModelicaParser::Component_declarationContext *ctx) override;
198  void exitClass_modification(
199  ModelicaParser::Class_modificationContext *ctx) override;
200  void exitStmt_block(ModelicaParser::Stmt_blockContext *ctx) override;
201  void exitEquation_section(
202  ModelicaParser::Equation_sectionContext *ctx) override;
203  void exitAlgorithm_section(
204  ModelicaParser::Algorithm_sectionContext *ctx) override;
205  void exitType_specifier(ModelicaParser::Type_specifierContext *ctx) override;
206  void exitName(ModelicaParser::NameContext *ctx) override;
207  void exitComponent_reference(
208  ModelicaParser::Component_referenceContext *ctx) override;
209  void exitArray_arg_expr(ModelicaParser::Array_arg_exprContext *ctx) override;
210  void exitArray_arg_for(ModelicaParser::Array_arg_forContext *ctx) override;
211  void exitArray_arguments(
212  ModelicaParser::Array_argumentsContext *ctx) override;
213  void exitNamed_arguments(
214  ModelicaParser::Named_argumentsContext *ctx) override;
215  void exitNamed_argument(ModelicaParser::Named_argumentContext *ctx) override;
216  void exitOutput_expression_list(
217  ModelicaParser::Output_expression_listContext *ctx) override;
218  void exitExpression_list(
219  ModelicaParser::Expression_listContext *ctx) override;
220  void exitArray_subscripts(
221  ModelicaParser::Array_subscriptsContext *ctx) override;
222  void exitSubscript(ModelicaParser::SubscriptContext *ctx) override;
223  void exitComment(ModelicaParser::CommentContext *ctx) override;
224  void exitString_comment(ModelicaParser::String_commentContext *ctx) override;
225  void exitAnnotation(ModelicaParser::AnnotationContext *ctx) override;
226  void exitClass_def_long(ModelicaParser::Class_def_longContext *ctxt) override;
227  void exitClass_def_der(ModelicaParser::Class_def_derContext *ctxt) override;
228  void exitClass_def_short(
229  ModelicaParser::Class_def_shortContext *ctxt) override;
230  void exitClass_def_type(ModelicaParser::Class_def_typeContext *ctxt) override;
231  void exitClass_def_enum(ModelicaParser::Class_def_enumContext *ctxt) override;
232  void exitArg_modification(
233  ModelicaParser::Arg_modificationContext *ctxt) override;
234  void exitArg_redeclare_class(
235  ModelicaParser::Arg_redeclare_classContext *ctxt) override;
236  void exitArg_redeclare_element(
237  ModelicaParser::Arg_redeclare_elementContext *ctxt) override;
238  void exitModification_class(
239  ModelicaParser::Modification_classContext *ctx) override;
240  void exitModification_equation(
241  ModelicaParser::Modification_equationContext *ctx) override;
242  void exitModification_statement(
243  ModelicaParser::Modification_statementContext *ctx) override;
244 };
245 
246 } // namespace cymoca
247 
248 #endif
CompilerException(const std::string &arg, const char *file, int line)
Definition: compiler.h:21
T * getAst(antlr4::ParserRuleContext *ctx)
Definition: compiler.h:60
antlr4::CommonTokenStream & getTokenStream()
Definition: compiler.h:39
antlr4::ANTLRInputStream m_input
Definition: compiler.h:48
std::unique_ptr< ModelicaParser > m_parser
Definition: compiler.h:47
void linkAst(antlr4::ParserRuleContext *to, antlr4::ParserRuleContext *from)
Definition: compiler.h:102
std::unique_ptr< T > cloneAst(antlr4::ParserRuleContext *ctx)
Definition: compiler.h:87
const char * what() const
Definition: compiler.h:28
ModelicaLexer m_lexer
Definition: compiler.h:49
ModelicaParser & getParser()
Definition: compiler.h:38
void setAst(antlr4::ParserRuleContext *ctx, std::unique_ptr< ast::INode > node)
Definition: compiler.h:93
std::unique_ptr< Derived > static_unique_ptr_cast(std::unique_ptr< Base > &&p)
Definition: util.h:7
std::unique_ptr< T > moveAst(antlr4::ParserRuleContext *ctx)
Definition: compiler.h:74
ast::model::Class * root()
Definition: compiler.h:40
AstMap m_ast
Definition: compiler.h:53
std::unordered_map< antlr4::ParserRuleContext *, std::unique_ptr< ast::INode >> AstMap
Definition: compiler.h:44
antlr4::CommonTokenStream m_token_stream
Definition: compiler.h:50