6 : ModelicaBaseListener(),
10 m_token_stream(&m_lexer),
16 antlr4::tree::ParseTree *tree =
m_parser->stored_definition();
17 antlr4::tree::ParseTreeWalker::DEFAULT.walk(
this, tree);
23 for (
int i = 0; i < n; i++) {
32 std::cout <<
"terminal: " << node->getText() << std::endl;
40 std::cout <<
indent(ctx->depth()) <<
">> "
41 <<
m_parser->getRuleNames()[ctx->getRuleIndex()] << std::endl;
47 std::cout <<
indent(ctx->depth()) <<
"<< "
48 <<
m_parser->getRuleNames()[ctx->getRuleIndex()] << std::endl;
61 auto res = std::make_unique<ast::condition::Boolean>(
false);
64 }
else if (ctx->FALSE()) {
69 setAst(ctx, std::move(res));
73 std::string op = ctx->op->getText();
74 auto left = cloneAst<ast::condition::Base>(ctx->condition(0));
75 auto right = cloneAst<ast::condition::Base>(ctx->condition(1));
77 setAst(ctx, std::make_unique<ast::condition::And>(std::move(left),
79 }
else if (op ==
"or") {
80 setAst(ctx, std::make_unique<ast::condition::Or>(std::move(left),
88 assert(ctx->op->getText() ==
"-");
89 auto e = cloneAst<ast::condition::Base>(ctx->condition());
90 setAst(ctx, std::make_unique<ast::condition::Not>(std::move(e)));
94 auto left = cloneAst<ast::expression::Base>(ctx->expr(0));
95 auto right = cloneAst<ast::expression::Base>(ctx->expr(1));
96 std::string op = ctx->op->getText();
98 setAst(ctx, std::make_unique<ast::condition::LessThan>(std::move(left),
100 }
else if (op ==
"<=") {
101 setAst(ctx, std::make_unique<ast::condition::LessThanOrEqual>(
102 std::move(left), std::move(right)));
103 }
else if (op ==
">") {
104 setAst(ctx, std::make_unique<ast::condition::GreaterThan>(
105 std::move(left), std::move(right)));
106 }
else if (op ==
">=") {
107 setAst(ctx, std::make_unique<ast::condition::GreaterThanOrEqual>(
108 std::move(left), std::move(right)));
109 }
else if (op ==
"==") {
110 setAst(ctx, std::make_unique<ast::condition::Equal>(std::move(left),
112 }
else if (op ==
"<>") {
113 setAst(ctx, std::make_unique<ast::condition::NotEqual>(std::move(left),
131 auto left = cloneAst<ast::expression::Base>(ctx->expr());
132 auto right = cloneAst<ast::expression::Base>(ctx->expression());
133 setAst(ctx, std::make_unique<ast::equation::Simple>(std::move(left),
138 auto res = std::make_unique<ast::equation::List>();
139 for (
auto eq : ctx->equation()) {
140 res->append(cloneAst<ast::equation::Base>(eq));
142 setAst(ctx, std::move(res));
155 assert(ctx->condition().size() == ctx->eq_block().size());
156 auto when = std::make_unique<ast::equation::When>();
157 for (
size_t i = 0; i < ctx->condition().size(); i++) {
158 auto block = std::make_unique<ast::equation::Block>(
159 cloneAst<ast::condition::Base>(ctx->condition(i)),
160 cloneAst<ast::equation::List>(ctx->eq_block(i)));
161 when->append(std::move(block));
163 setAst(ctx, std::move(when));
206 std::stringstream ss(ctx->getText());
209 auto num = std::make_unique<ast::expression::Number>(value);
210 setAst(ctx, std::move(num));
214 std::vector<std::string> ids;
215 for (
auto id : ctx->component_reference()->IDENT()) {
216 ids.push_back(id->getText());
219 setAst(ctx, std::make_unique<ast::expression::Reference>(ids[0]));
229 if (ctx->component_reference()) {
231 std::make_unique<ast::expression::Function>(
232 cloneAst<ast::expression::Reference>(ctx->component_reference()),
233 cloneAst<ast::expression::List>(ctx->function_call_args())));
234 }
else if (ctx->func) {
237 std::make_unique<ast::expression::Function>(
238 std::make_unique<ast::expression::Reference>(ctx->func->getText()),
239 cloneAst<ast::expression::List>(ctx->function_call_args())));
251 setAst(ctx, std::make_unique<ast::expression::Negative>(
252 cloneAst<ast::expression::Base>(ctx->expr())));
275 ModelicaParser::Function_call_argsContext *ctx) {
276 auto args = std::make_unique<ast::expression::List>();
277 for (
auto arg_ctx : ctx->function_argument()) {
278 args->append(cloneAst<ast::expression::Base>(arg_ctx));
280 setAst(ctx, std::move(args));
283 setAst(ctx, cloneAst<ast::expression::Base>(ctx->expression()));
309 linkAst(ctx, ctx->component_clause());
321 ModelicaParser::Stored_definitionContext *ctx) {
326 ModelicaParser::Enumeration_literalContext *ctx) {
330 auto c = std::make_unique<ast::model::Class>(
331 std::make_unique<ast::model::ElementDict>(),
332 std::make_unique<ast::equation::List>());
335 enum class Visibility { PUBLIC, PRIVATE, PROTECTED };
336 for (
auto elem_sect :
337 {std::make_pair(Visibility::PUBLIC, ctx->public_elem),
338 std::make_pair(Visibility::PRIVATE, ctx->private_elem),
339 std::make_pair(Visibility::PROTECTED, ctx->protected_elem)}) {
340 for (
auto e_ctx : elem_sect.second) {
342 auto edict = getAst<ast::model::ElementDict>(e_ctx);
343 for (
auto &key_val : edict->getMap()) {
345 c->getElements().set(key_val.first, std::move(e));
351 for (
auto eq_sec : ctx->equation_section()) {
352 for (
auto eq : eq_sec->equation()) {
353 c->getEquations().append(cloneAst<ast::equation::Base>(eq));
358 for (
auto algo_sec : ctx->algorithm_section()) {
359 for (
auto s_ctx : algo_sec->statement()) {
360 auto s = cloneAst<ast::statement::Base>(s_ctx);
361 c->getStatements().append(std::move(s));
365 setAst(ctx, std::move(c));
368 ModelicaParser::External_function_callContext *ctx) {
372 ModelicaParser::Constraining_clauseContext *ctx) {
376 ModelicaParser::Component_clauseContext *ctx) {
378 auto elements = std::make_unique<ast::model::ElementDict>();
379 auto type = ctx->type_specifier()->getText();
380 auto prefix_str = ctx->type_prefix()->getText();
382 if (prefix_str ==
"parameter") {
384 }
else if (prefix_str ==
"constant") {
386 }
else if (prefix_str ==
"discrete") {
388 }
else if (prefix_str ==
"") {
393 for (
auto d : ctx->component_declaration()) {
394 std::string name = d->IDENT()->getText();
396 name, std::make_unique<ast::element::Component>(name, type, prefix));
398 setAst(ctx, std::move(elements));
404 ModelicaParser::Component_declarationContext *ctx) {
408 ModelicaParser::Class_modificationContext *ctx) {
415 ModelicaParser::Equation_sectionContext *ctx) {
416 auto eqs = std::make_unique<ast::equation::List>();
417 for (
auto eq : ctx->equation()) {
418 eqs->append(cloneAst<ast::equation::Base>(eq));
420 setAst(ctx, std::move(eqs));
423 ModelicaParser::Algorithm_sectionContext *ctx) {
433 ModelicaParser::Component_referenceContext *ctx) {
435 setAst(ctx, std::make_unique<ast::expression::Reference>(ctx->getText()));
444 ModelicaParser::Array_argumentsContext *ctx) {
448 ModelicaParser::Named_argumentsContext *ctx) {
455 ModelicaParser::Output_expression_listContext *ctx) {
459 ModelicaParser::Expression_listContext *ctx) {
463 ModelicaParser::Array_subscriptsContext *ctx) {
486 ModelicaParser::Class_def_shortContext *ctxt) {
496 ModelicaParser::Arg_modificationContext *ctxt) {
500 ModelicaParser::Arg_redeclare_classContext *ctxt) {
504 ModelicaParser::Arg_redeclare_elementContext *ctxt) {
508 ModelicaParser::Modification_classContext *ctx) {
512 ModelicaParser::Modification_equationContext *ctx) {
513 auto e = cloneAst<ast::expression::Base>(ctx->expression());
517 ModelicaParser::Modification_statementContext *ctx) {
518 auto e = cloneAst<ast::expression::Base>(ctx->expression());
void exitCond_unary(ModelicaParser::Cond_unaryContext *ctx) override
void exitExpression_list(ModelicaParser::Expression_listContext *ctx) override
void exitCond_binary(ModelicaParser::Cond_binaryContext *ctx) override
void exitName(ModelicaParser::NameContext *ctx) override
void exitElem_comp(ModelicaParser::Elem_compContext *ctx) override
void exitStmt_if(ModelicaParser::Stmt_ifContext *ctx) override
void exitComposition(ModelicaParser::CompositionContext *ctx) override
void exitFor_indices(ModelicaParser::For_indicesContext *ctx) override
void exitClass_modification(ModelicaParser::Class_modificationContext *ctx) override
void exitClass_def_short(ModelicaParser::Class_def_shortContext *ctxt) override
void exitSubscript(ModelicaParser::SubscriptContext *ctx) override
void exitCond_ref(ModelicaParser::Cond_refContext *ctx) override
void exitExpr_string(ModelicaParser::Expr_stringContext *ctx) override
void visitErrorNode(antlr4::tree::ErrorNode *node) override
void exitComponent_reference(ModelicaParser::Component_referenceContext *ctx) override
void exitModification_equation(ModelicaParser::Modification_equationContext *ctx) override
void exitStored_definition(ModelicaParser::Stored_definitionContext *ctx) override
void exitEq_if(ModelicaParser::Eq_ifContext *ctx) override
void exitComponent_declaration(ModelicaParser::Component_declarationContext *ctx) override
void exitModification_class(ModelicaParser::Modification_classContext *ctx) override
void exitStmt_for(ModelicaParser::Stmt_forContext *ctx) override
void exitExternal_function_call(ModelicaParser::External_function_callContext *ctx) override
void exitElem_import(ModelicaParser::Elem_importContext *ctx) override
void exitExpr_output(ModelicaParser::Expr_outputContext *ctx) override
void exitEnumeration_literal(ModelicaParser::Enumeration_literalContext *ctx) override
void exitCond_func(ModelicaParser::Cond_funcContext *ctx) override
void exitClass_prefixes(ModelicaParser::Class_prefixesContext *ctx) override
void exitType_prefix(ModelicaParser::Type_prefixContext *ctx) override
void exitStmt_func(ModelicaParser::Stmt_funcContext *ctx) override
void exitExpr_number(ModelicaParser::Expr_numberContext *ctx) override
void exitType_specifier(ModelicaParser::Type_specifierContext *ctx) override
void exitFunc_arg_named(ModelicaParser::Func_arg_namedContext *ctx) override
void exitEveryRule(antlr4::ParserRuleContext *ctx) override
void exitExpr_simple(ModelicaParser::Expr_simpleContext *ctx) override
void exitExpr_if(ModelicaParser::Expr_ifContext *ctx) override
void exitEq_for(ModelicaParser::Eq_forContext *ctx) override
void exitAnnotation(ModelicaParser::AnnotationContext *ctx) override
void exitEq_simple(ModelicaParser::Eq_simpleContext *ctx) override
void exitExpr_list(ModelicaParser::Expr_listContext *ctx) override
std::unique_ptr< ModelicaParser > m_parser
void exitEq_connect(ModelicaParser::Eq_connectContext *ctx) override
void exitConstraining_clause(ModelicaParser::Constraining_clauseContext *ctx) override
void exitComment(ModelicaParser::CommentContext *ctx) override
void linkAst(antlr4::ParserRuleContext *to, antlr4::ParserRuleContext *from)
void exitNamed_argument(ModelicaParser::Named_argumentContext *ctx) override
void exitArray_arg_for(ModelicaParser::Array_arg_forContext *ctx) override
void exitClass_def_der(ModelicaParser::Class_def_derContext *ctxt) override
void exitAlgorithm_section(ModelicaParser::Algorithm_sectionContext *ctx) override
void exitEq_func(ModelicaParser::Eq_funcContext *ctx) override
void enterEveryRule(antlr4::ParserRuleContext *ctx) override
void exitClass_def_long(ModelicaParser::Class_def_longContext *ctxt) override
void exitArg_modification(ModelicaParser::Arg_modificationContext *ctxt) override
void exitExpr_func(ModelicaParser::Expr_funcContext *ctx) override
void exitOutput_expression_list(ModelicaParser::Output_expression_listContext *ctx) override
void exitStmt_key(ModelicaParser::Stmt_keyContext *ctx) override
void exitModification_statement(ModelicaParser::Modification_statementContext *ctx) override
void exitClass_def_enum(ModelicaParser::Class_def_enumContext *ctxt) override
void exitFor_index(ModelicaParser::For_indexContext *ctx) override
void exitFunc_arg_for(ModelicaParser::Func_arg_forContext *ctx) override
void exitArray_arguments(ModelicaParser::Array_argumentsContext *ctx) override
void exitArg_redeclare_class(ModelicaParser::Arg_redeclare_classContext *ctxt) override
void exitFunction_call_args(ModelicaParser::Function_call_argsContext *ctx) override
void exitStmt_ref(ModelicaParser::Stmt_refContext *ctx) override
void exitElem_extends(ModelicaParser::Elem_extendsContext *ctx) override
void exitStmt_when(ModelicaParser::Stmt_whenContext *ctx) override
void setAst(antlr4::ParserRuleContext *ctx, std::unique_ptr< ast::INode > node)
void exitClass_def_type(ModelicaParser::Class_def_typeContext *ctxt) override
void exitExpr_unary(ModelicaParser::Expr_unaryContext *ctx) override
void exitArg_redeclare_element(ModelicaParser::Arg_redeclare_elementContext *ctxt) override
void exitFunc_arg_func(ModelicaParser::Func_arg_funcContext *ctx) override
ast::model::Class * m_root
void exitExpr_ref(ModelicaParser::Expr_refContext *ctx) override
void exitArray_arg_expr(ModelicaParser::Array_arg_exprContext *ctx) override
void exitEq_when(ModelicaParser::Eq_whenContext *ctx) override
void exitExpr_binary(ModelicaParser::Expr_binaryContext *ctx) override
void exitStmt_block(ModelicaParser::Stmt_blockContext *ctx) override
void exitString_comment(ModelicaParser::String_commentContext *ctx) override
void exitCond_bool(ModelicaParser::Cond_boolContext *ctx) override
void exitElem_class(ModelicaParser::Elem_classContext *ctx) override
void exitFunc_arg_expr(ModelicaParser::Func_arg_exprContext *ctx) override
void exitComponent_clause(ModelicaParser::Component_clauseContext *ctx) override
void exitEq_block(ModelicaParser::Eq_blockContext *ctx) override
Compiler(std::ifstream &text)
void exitExpr_array(ModelicaParser::Expr_arrayContext *ctx) override
#define compiler_exception(arg)
void exitNamed_arguments(ModelicaParser::Named_argumentsContext *ctx) override
void exitExpr_range(ModelicaParser::Expr_rangeContext *ctx) override
void visitTerminal(antlr4::tree::TerminalNode *node) override
void exitEquation_section(ModelicaParser::Equation_sectionContext *ctx) override
std::string indent(int n)
void exitStmt_while(ModelicaParser::Stmt_whileContext *ctx) override
void exitCond_compare(ModelicaParser::Cond_compareContext *ctx) override
void exitExpr_end(ModelicaParser::Expr_endContext *ctx) override
antlr4::CommonTokenStream m_token_stream
void exitArray_subscripts(ModelicaParser::Array_subscriptsContext *ctx) override