1 #ifndef CYMOCA_COMPILER_H_
2 #define CYMOCA_COMPILER_H_
6 #include <unordered_map>
10 #include <modelica_antlr/ModelicaBaseListener.h>
11 #include <modelica_antlr/ModelicaLexer.h>
13 using namespace modelica_antlr;
22 : std::runtime_error(arg) {
24 o << file <<
":" << line <<
": " << arg;
28 const char *
what()
const throw() {
return msg.c_str(); }
30 #define compiler_exception(arg) CompilerException(arg, __FILE__, __LINE__);
37 explicit Compiler(std::ifstream &text);
43 using AstMap = std::unordered_map<antlr4::ParserRuleContext *,
44 std::unique_ptr<ast::INode>>;
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());
74 std::unique_ptr<T>
moveAst(antlr4::ParserRuleContext *ctx) {
75 auto iter = m_ast.find(ctx);
76 assert(iter != m_ast.end());
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>();
93 void setAst(antlr4::ParserRuleContext *ctx,
94 std::unique_ptr<ast::INode> node) {
95 auto iter = m_ast.find(ctx);
97 assert(node !=
nullptr);
98 assert(iter == m_ast.end());
99 m_ast[ctx] = std::move(node);
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));
112 std::string indent(
int n);
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;
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;
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;
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;
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;
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;
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;
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;
CompilerException(const std::string &arg, const char *file, int line)
T * getAst(antlr4::ParserRuleContext *ctx)
antlr4::CommonTokenStream & getTokenStream()
antlr4::ANTLRInputStream m_input
std::unique_ptr< ModelicaParser > m_parser
void linkAst(antlr4::ParserRuleContext *to, antlr4::ParserRuleContext *from)
std::unique_ptr< T > cloneAst(antlr4::ParserRuleContext *ctx)
const char * what() const
ModelicaParser & getParser()
void setAst(antlr4::ParserRuleContext *ctx, std::unique_ptr< ast::INode > node)
std::unique_ptr< Derived > static_unique_ptr_cast(std::unique_ptr< Base > &&p)
std::unique_ptr< T > moveAst(antlr4::ParserRuleContext *ctx)
ast::model::Class * root()
std::unordered_map< antlr4::ParserRuleContext *, std::unique_ptr< ast::INode >> AstMap
antlr4::CommonTokenStream m_token_stream