From da5b61c795aa3e0417f89e62544c1ed025bcda46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= Date: Sat, 19 Mar 2022 11:46:29 -0700 Subject: [PATCH] Remove the Fortran AST This removes all code that used it. --- build0.sh | 2 - build1_win.sh | 6 +- ci/build.xsh | 2 - grammar/AST.asdl | 436 -- src/bin/lpython.cpp | 2 - src/lpython/CMakeLists.txt | 6 - src/lpython/ast_serialization.cpp | 81 - src/lpython/ast_serialization.h | 15 - src/lpython/ast_to_openmp.cpp | 964 ---- src/lpython/ast_to_openmp.h | 13 - src/lpython/ast_to_src.cpp | 4419 ------------------ src/lpython/ast_to_src.h | 14 - src/lpython/mod_to_asr.cpp | 367 -- src/lpython/mod_to_asr.h | 12 - src/lpython/pickle.cpp | 142 - src/lpython/pickle.h | 5 - src/lpython/semantics/python_comptime_eval.h | 1 - src/lpython/tests/CMakeLists.txt | 1 - src/lpython/tests/test_ast.cpp | 27 - src/lpython/tests/test_llvm.cpp | 1 - src/lpython/tests/test_parse.cpp | 22 - src/lpython/tests/test_serialization.cpp | 2 - src/lpython/tests/test_stacktrace2.cpp | 1 - 23 files changed, 5 insertions(+), 6536 deletions(-) delete mode 100644 grammar/AST.asdl delete mode 100644 src/lpython/ast_serialization.cpp delete mode 100644 src/lpython/ast_serialization.h delete mode 100644 src/lpython/ast_to_openmp.cpp delete mode 100644 src/lpython/ast_to_openmp.h delete mode 100644 src/lpython/ast_to_src.cpp delete mode 100644 src/lpython/ast_to_src.h delete mode 100644 src/lpython/mod_to_asr.cpp delete mode 100644 src/lpython/mod_to_asr.h delete mode 100644 src/lpython/tests/test_ast.cpp diff --git a/build0.sh b/build0.sh index 16e7038581..bb64a32921 100755 --- a/build0.sh +++ b/build0.sh @@ -6,8 +6,6 @@ set -x # Generate the `version` file ci/version.sh -# Generate a Fortran AST from AST.asdl (C++) -python grammar/asdl_cpp.py # Generate a Python AST from Python.asdl (Python) python grammar/asdl_py.py # Generate a Python AST from Python.asdl (C++) diff --git a/build1_win.sh b/build1_win.sh index 7e0ca8fe9f..1b04d97f2d 100644 --- a/build1_win.sh +++ b/build1_win.sh @@ -1,5 +1,9 @@ #!/usr/bin/env bash bash ci/version.sh -python grammar/asdl_cpp.py +# Generate a Python AST from Python.asdl (Python) +python grammar/asdl_py.py +# Generate a Python AST from Python.asdl (C++) +python grammar/asdl_cpp.py grammar/Python.asdl src/lpython/python_ast.h +# Generate a Fortran ASR from ASR.asdl (C++) python grammar/asdl_cpp.py grammar/ASR.asdl src/libasr/asr.h diff --git a/ci/build.xsh b/ci/build.xsh index c1459188c9..964a0403c2 100755 --- a/ci/build.xsh +++ b/ci/build.xsh @@ -26,8 +26,6 @@ llvm-config --components # Generate the `version` file bash ci/version.sh -# Generate a Fortran AST from AST.asdl (C++) -python grammar/asdl_cpp.py # Generate a Fortran ASR from ASR.asdl (C++) python grammar/asdl_cpp.py grammar/ASR.asdl src/libasr/asr.h # Generate a Python AST from Python.asdl (C++) diff --git a/grammar/AST.asdl b/grammar/AST.asdl deleted file mode 100644 index e0e46bc7ee..0000000000 --- a/grammar/AST.asdl +++ /dev/null @@ -1,436 +0,0 @@ --- This is an Abstract Syntax Description Language (ASDL) that describes the --- Fortran's Abstract Syntax Tree (AST). See [1] for a short background --- information and motivation and see the paper [2] for a detailed motivation, --- explanation and specification of the language. See [3] for further examples --- of ASDL usage in a real compiler. --- --- [1] https://eli.thegreenplace.net/2014/06/04/using-asdl-to-describe-asts-in-compilers/ --- [2] Wang, D. C., Appel, A. W., Korn, J. L., & Serra, C. S. (1997). The Zephyr Abstract Syntax Description Language. USENIX Conference on Domain-Specific Languages, (October), 213–228. --- [3] https://arxiv.org/abs/cs/9810013 --- --- ASDL's builtin types are: --- * identifier --- * int (signed integers of infinite precision) --- * string --- We extend these by: --- * node (any ASDL node) --- * bool --- --- Specific tools may choose to produce language interfaces that represent --- these types and the ASDL tree in a language specific way (e.g. use finite --- precision integers and signal an error otherwise). --- --- At the AST level we strictly only represent local syntax (no semantics). That --- way each syntax construct is parsed locally, no need to do any non-local --- lookups to figure out what AST node to construct. That is the job of the AST --- to ASR conversion to do non-local lookups to figure out what is what (i.e., --- disambiguate) and report any errors. - -module AST { - -unit - = TranslationUnit(node* items) - -mod - = Module(identifier name, trivia? trivia, unit_decl1* use, implicit_statement* implicit, - unit_decl2* decl, program_unit* contains) - | Submodule(identifier id, identifier? parent_name, identifier name, trivia? trivia, - unit_decl1* use, implicit_statement* implicit, - unit_decl2* decl, program_unit* contains) - | BlockData(identifier? name, trivia? trivia, unit_decl1* use, - implicit_statement* implicit, unit_decl2* decl) - | Program(identifier name, trivia? trivia, unit_decl1* use, implicit_statement* implicit, - unit_decl2* decl, stmt* body, program_unit* contains) - -program_unit - = Subroutine(identifier name, arg* args, decl_attribute* attributes, - bind? bind, trivia? trivia, unit_decl1* use, import_statement* import, - implicit_statement* implicit, unit_decl2* decl, - stmt* body, program_unit* contains) - | Procedure(identifier name, arg* args, decl_attribute* attributes, trivia? trivia, - unit_decl1* use, import_statement* import, implicit_statement* implicit, - unit_decl2* decl, stmt* body, program_unit* contains) - | Function(identifier name, arg* args, decl_attribute* attributes, - expr? return_var, bind? bind, trivia? trivia, unit_decl1* use, import_statement* import, - implicit_statement* implicit, unit_decl2* decl, stmt* body, - program_unit* contains) - -unit_decl1 - = Use(decl_attribute* nature, identifier module, use_symbol* symbols, - bool only_present, trivia? trivia) - -unit_decl2 - = Declaration(decl_attribute? vartype, decl_attribute* attributes, - var_sym* syms, trivia? trivia) - | Interface(interface_header header, trivia? trivia, interface_item* items) - | DerivedType(identifier name, identifier* namelist, trivia? trivia, decl_attribute* attrtype, - unit_decl2* items, procedure_decl* contains) - | Enum(decl_attribute* attr, trivia? trivia, unit_decl2* items) - -interface_header - = InterfaceHeader() - | InterfaceHeaderName(identifier name) - | InterfaceHeaderAssignment() - | InterfaceHeaderOperator(intrinsicop op) - | InterfaceHeaderDefinedOperator(string operator_name) - | AbstractInterfaceHeader() - | InterfaceHeaderWrite(identifier id) - | InterfaceHeaderRead(identifier id) - -interface_item - = InterfaceProc(program_unit proc) - | InterfaceModuleProcedure(identifier* names, decl_attribute* attributes, trivia? trivia) - -import_statement - = Import(identifier* symbols, import_modifier mod, trivia? trivia) - -import_modifier - = ImportDefault - | ImportOnly - | ImportNone - | ImportAll - -implicit_statement - = ImplicitNone(implicit_none_spec* specs, trivia? trivia) - | Implicit(decl_attribute type, letter_spec* kind, letter_spec* specs, trivia? trivia) - -implicit_none_spec - = ImplicitNoneExternal(int dummy) - | ImplicitNoneType() - -letter_spec - = LetterSpec(identifier? start, identifier end) - -stmt --- Single-line statements (each has a `label`): - = Allocate(int label, fnarg* args, keyword* keywords, trivia? trivia) - | Assign(int label, int assign_label, identifier variable, trivia? trivia) - | Assignment(int label, expr target, expr value, trivia? trivia) - | Associate(int label, expr target, expr value, trivia? trivia) - | Backspace(int label, expr* args, keyword* kwargs, trivia? trivia) - | Close(int label, expr* args, keyword* kwargs, trivia? trivia) - | Continue(int label, trivia? trivia) - | Cycle(int label, identifier? stmt_name, trivia? trivia) - | Deallocate(int label, fnarg* args, keyword* keywords, trivia? trivia) - | Endfile(int label, expr* args, keyword* kwargs, trivia? trivia) - | Entry(int label, identifier name, arg* args, expr? return_var, - bind? bind, trivia? trivia) - | ErrorStop(int label, expr? code, expr? quiet, trivia? trivia) - | EventPost(int label, expr variable, event_attribute* stat, trivia? trivia) - | EventWait(int label, expr variable, event_attribute* spec, trivia? trivia) - | Exit(int label, identifier? stmt_name, trivia? trivia) - | Flush(int label, expr* args, keyword* kwargs, trivia? trivia) - | ForAllSingle(int label, identifier? stmt_name, - concurrent_control *control, expr? mask, stmt assign, trivia? trivia) - | Format(int label, string fmt, trivia? trivia) - | FormTeam(int label, expr team_number, identifier team_var, - event_attribute* sync_stat, trivia? trivia) - | GoTo(int label, identifier? int_var, expr? goto_label, - expr* labels, trivia? trivia) - | Inquire(int label, expr* args, keyword* kwargs, expr* values, trivia? trivia) - | Nullify(int label, expr* args, keyword* kwargs, trivia? trivia) - | Open(int label, expr* args, keyword* kwargs, trivia? trivia) - | Return(int label, expr? value, trivia? trivia) - | Print(int label, expr? fmt, expr* values, trivia? trivia) - | Read(int label, expr? format, argstar* args, - kw_argstar* kwargs, expr* values, trivia? trivia) - | Rewind(int label, expr* args, keyword* kwargs, trivia? trivia) - | Stop(int label, expr? code, expr? quiet, trivia? trivia) - | SubroutineCall(int label, identifier name, struct_member* member, - fnarg* args, keyword* keywords, trivia? trivia) - | SyncAll(int label, event_attribute* stat, trivia? trivia) - | SyncImages(int label, expr? image_set, symbol sym, - event_attribute* stat, trivia? trivia) - | SyncMemory(int label, event_attribute* stat, trivia? trivia) - | SyncTeam(int label, expr value, event_attribute* stat, trivia? trivia) - | Write(int label, argstar* args, kw_argstar* kwargs, expr* values, trivia? trivia) - --- Multi-line statements (each has a `label` and `stmt_name`): - | AssociateBlock(int label, identifier? stmt_name, var_sym* syms, - stmt* body, trivia? t_inside, trivia? trivia) - | Block(int label, identifier? stmt_name, unit_decl1* use, - import_statement* import,unit_decl2* decl, stmt* body, - trivia? t_inside, trivia? trivia) - | ChangeTeam(int label, identifier? stmt_name, expr team_value, - team_attribute* coarray_assoc, event_attribute* sync, - stmt* body, trivia? t_inside, trivia? trivia, event_attribute* sync_stat) - | Critical(int label, identifier? stmt_name, event_attribute* sync_stat, - stmt* body, trivia? t_inside, trivia? trivia) - | DoConcurrentLoop(int label, identifier? stmt_name, - concurrent_control *control, expr? mask, - concurrent_locality* locality, stmt* body, - trivia? t_inside, trivia? trivia) - | DoLoop(int label, identifier? stmt_name, int do_label, identifier? var, - expr? start, expr? end, expr? increment, stmt* body, - trivia? t_inside, trivia? trivia) - | ForAll(int label, identifier? stmt_name, - concurrent_control *control, expr? mask, - concurrent_locality* locality, stmt* body, - trivia? t_inside, trivia? trivia) - | If(int label, identifier? stmt_name, expr test, stmt* body, - stmt* orelse, trivia? if_trivia, trivia? else_trivia, trivia? trivia) - | IfArithmetic(int label, identifier? stmt_name, expr test, - int lt_label, int eq_label, int gt_label, - trivia? trivia) - | Select(int label, identifier? stmt_name, expr test, - case_stmt* body, trivia? t_inside, trivia? trivia) - | SelectRank(int label, identifier? stmt_name, identifier? assoc_name, - expr selector, rank_stmt* body, trivia? t_inside, trivia? trivia) - | SelectType(int label, identifier? stmt_name, identifier? assoc_name, - expr selector, type_stmt* body, trivia? t_inside, trivia? trivia) - | Where(int label, identifier? stmt_name, expr test, stmt* body, - stmt* orelse, trivia? t_inside, trivia? trivia) - | WhileLoop(int label, identifier? stmt_name, expr test, - stmt* body, trivia? t_inside, trivia? trivia) - -expr - = BoolOp(expr left, boolop op, expr right) - | BinOp(expr left, operator op, expr right) - | DefBinOp(expr left, string op, expr right) - | StrOp(expr left, stroperator op, expr right) - | UnaryOp(unaryop op, expr operand) - | DefUnaryOp(string op, expr operand) - | Compare(expr left, cmpop op, expr right) - | FuncCallOrArray(identifier func, struct_member* member, - fnarg* args, keyword* keywords, fnarg* subargs) - | CoarrayRef(identifier name, struct_member* member, - fnarg* args, keyword* fnkw, coarrayarg* coargs, keyword* cokw) - | ArrayInitializer(decl_attribute? vartype, identifier? classtype, expr* args) - | ImpliedDoLoop(expr* values, identifier var, expr start, expr end, - expr? increment) - | Num(int n, string? kind) - | Real(string n) - | Complex(expr re, expr im) - | String(string s) - | Substring(string s, fnarg* args) - | BOZ(string s) - | Name(identifier id, struct_member* member) - | Logical(bool value) - | DataImpliedDo(expr* object_list, decl_attribute? type, - identifier var, expr start, expr end, expr? increment) - | Parenthesis(expr operand) - - --- All statement nodes have an optional trivia?, here is the meaning: --- nullptr ... Equivalent to \n (the statement ends with \n) --- Meaning of trivia_node (in both `inside` and `after`): --- Comment ...... Comment followed by \n (previous line must be ended) --- EOLComment ... Ends the current line with a comment followed by \n --- EndOfLine .... Ends the current line with \n --- Semicolon .... ";" (just one character, does not end the line) --- The trivia starts with an open line, must be first ended by either --- EOLComment or EndOfLine. - - -trivia - = TriviaNode(trivia_node* inside, trivia_node* after) - -trivia_node - = Comment(string comment) - | EOLComment(string comment) - | EndOfLine() - | Semicolon() - -boolop = And | Or | Xor | Eqv | NEqv - -operator = Add | Sub | Mul | Div | Pow - -stroperator = Concat - -unaryop = Invert | Not | UAdd | USub - -cmpop = Eq | NotEq | Lt | LtE | Gt | GtE - -intrinsicop - = AND | OR | XOR | EQV | NEQV - | PLUS | MINUS | STAR | DIV | POW - | NOT - | EQ | NOTEQ | LT | LTE | GT | GTE - | CONCAT - -procedure_decl - = DerivedTypeProc(identifier? name, decl_attribute* attr, - use_symbol* symbols, trivia? trivia) - | GenericOperator(decl_attribute* attr, intrinsicop op, identifier* names, trivia? trivia) - | GenericDefinedOperator(decl_attribute* attr, string optype, - identifier* names, trivia? trivia) - | GenericAssignment(decl_attribute* attr, identifier* names, trivia? trivia) - | GenericName(decl_attribute* attr, identifier name, identifier* names, trivia? trivia) - | GenericWrite(decl_attribute* attr, identifier id, identifier* names, trivia? trivia) - | GenericRead(decl_attribute* attr, identifier id, identifier* names, trivia? trivia) - | FinalName(identifier name, trivia? trivia) - | Private(trivia? trivia) - -decl_attribute - = AttrBind(bind bind) - | AttrData(expr* object, expr* value) - | AttrDimension(dimension* dim) - | AttrCodimension(codimension* codim) - | AttrEquivalence(equi* args) - | AttrExtends(identifier name) - | AttrIntent(attr_intent intent) - | AttrNamelist(identifier name) - | AttrPass(identifier? name) - | SimpleAttribute(simple_attribute attr) - | AttrType(decl_type type, kind_item* kind, identifier? name, symbol sym) - | AttrAssignment() - | AttrIntrinsicOperator(intrinsicop op) - | AttrDefinedOperator(string op_name) - -simple_attribute - = AttrAbstract - | AttrAllocatable - | AttrAsynchronous - | AttrCommon - | AttrContiguous - | AttrDeferred - | AttrElemental - | AttrEnumerator - | AttrExternal - | AttrImpure - | AttrIntrinsic - | AttrKind - | AttrLen - | AttrModule - | AttrNoPass - | AttrNonDeferred - | AttrNon_Intrinsic - | AttrOptional - | AttrParameter - | AttrPointer - | AttrPrivate - | AttrProtected - | AttrPublic - | AttrPure - | AttrRecursive - | AttrSave - | AttrSequence - | AttrTarget - | AttrValue - | AttrVolatile - -attr_intent = In | Out | InOut - -decl_type - = TypeClass - | TypeCharacter - | TypeComplex - | TypeDoublePrecision - | TypeInteger - | TypeLogical - | TypeProcedure - | TypeReal - | TypeType - -event_attribute - = AttrStat(identifier variable) - | AttrErrmsg(identifier variable) - | AttrNewIndex(expr value) - | AttrEventWaitKwArg(identifier id, expr value) - -team_attribute = CoarrayAssociation(expr coarray, expr selector) - -var_sym = (identifier? name, dimension* dim, codimension* codim, - expr? initializer, symbol sym, decl_attribute? spec) - -kind_item = (identifier? id, expr? value, kind_item_type type) - -kind_item_type = Star | Colon | Value - -dimension = (expr? start, expr? end, dimension_type end_star) -dimension_type = DimensionExpr | DimensionStar | AssumedRank - -codimension = (expr? start, expr? end, codimension_type end_star) -codimension_type = CodimensionExpr | CodimensionStar - -symbol = None | Arrow | Equal | Asterisk | DoubleAsterisk | Slash - -equi = (expr* set_list) - --- Encoding of an array dimension declaration: --- start end end_star --- Declaration: --- X(n) 1 n Expr # Note: X(n) is equivalent to X(1:n) --- X(:) () () Expr --- X(a:) a () Expr --- X(:b) () b Expr --- X(a:b) a b Expr --- X(*) () () Star --- X(a:*) a () Star - - --- Null for `expr` means it's a star -kw_argstar = (identifier arg, expr? value) -argstar = (expr? value) - --- The identifier is wrapped up in a product type so that location information --- is included: -arg = (identifier arg) - - --- Encoding of array elements and sections in fnarg: --- start end step --- element: --- X(i) () i () --- section: --- X(:) () () 1 --- X(a:) a () 1 --- X(:b) () b 1 --- X(a:b) a b 1 --- X(::c) () () c --- X(a::c) a () c --- X(:b:c) () b c --- X(a:b:c) a b c --- -fnarg = (expr? start, expr? end, expr? step) - -coarrayarg = (expr? start, expr? end, expr? step, codimension_type star) - -keyword = (identifier arg, expr value) - -struct_member = (identifier name, fnarg* args) - -bind = Bind(expr* args, keyword* kwargs) - -array_index = ArrayIndex(expr? left, expr? right, expr? step) - -case_stmt - = CaseStmt(case_cond* test, trivia? trivia, stmt* body) - | CaseStmt_Default(trivia? trivia, stmt* body) - -case_cond - = CaseCondExpr(expr cond) - | CaseCondRange(expr? start, expr? end) - -rank_stmt - = RankExpr(expr value, trivia? trivia, stmt* body) - | RankStar(trivia? trivia, stmt* body) - | RankDefault(trivia? trivia, stmt* body) - -type_stmt - = TypeStmtName(identifier? name, trivia? trivia, stmt* body) - | TypeStmtType(decl_attribute? vartype, trivia? trivia, stmt* body) - | ClassStmt(identifier? id, trivia? trivia, stmt* body) - | ClassDefault(trivia? trivia, stmt* body) - -use_symbol - = UseSymbol(identifier remote_sym, identifier? local_rename) - | UseAssignment() - | IntrinsicOperator(intrinsicop op) - | DefinedOperator(string opName) - | RenameOperator(string local_defop, string use_defop) - | UseWrite(identifier id) - | UseRead(identifier id) - -concurrent_control = ConcurrentControl(identifier? var, expr? start, expr? end, expr? increment) - -concurrent_locality - = ConcurrentLocal(identifier *vars) - | ConcurrentLocalInit(identifier *vars) - | ConcurrentShared(identifier *vars) - | ConcurrentDefault() - | ConcurrentReduce(reduce_op op, identifier *vars) - -reduce_op = ReduceAdd | ReduceMul | ReduceMIN | ReduceMAX - -} diff --git a/src/bin/lpython.cpp b/src/bin/lpython.cpp index 22ff02d2a8..074d2474e6 100644 --- a/src/bin/lpython.cpp +++ b/src/bin/lpython.cpp @@ -9,12 +9,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include #include diff --git a/src/lpython/CMakeLists.txt b/src/lpython/CMakeLists.txt index 7bd9ac3112..8e6327ed7f 100644 --- a/src/lpython/CMakeLists.txt +++ b/src/lpython/CMakeLists.txt @@ -5,12 +5,6 @@ set(SRC pickle.cpp python_serialization.cpp - ast_serialization.cpp - - ast_to_src.cpp - ast_to_openmp.cpp - - mod_to_asr.cpp utils.cpp diff --git a/src/lpython/ast_serialization.cpp b/src/lpython/ast_serialization.cpp deleted file mode 100644 index 11b1d776ef..0000000000 --- a/src/lpython/ast_serialization.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include - -using LFortran::ASRUtils::symbol_parent_symtab; -using LFortran::ASRUtils::symbol_name; - -namespace LFortran { - -class ASTSerializationVisitor : -#ifdef WITH_LFORTRAN_BINARY_MODFILES - public BinaryWriter, -#else - public TextWriter, -#endif - public AST::SerializationBaseVisitor -{ -public: - void write_bool(bool b) { - if (b) { - write_int8(1); - } else { - write_int8(0); - } - } -}; - -std::string serialize(const AST::ast_t &ast) { - ASTSerializationVisitor v; - v.write_int8(ast.type); - v.visit_ast(ast); - return v.get_str(); -} - -std::string serialize(const AST::TranslationUnit_t &unit) { - return serialize((AST::ast_t&)(unit)); -} - -class ASTDeserializationVisitor : -#ifdef WITH_LFORTRAN_BINARY_MODFILES - public BinaryReader, -#else - public TextReader, -#endif - public AST::DeserializationBaseVisitor -{ -public: - ASTDeserializationVisitor(Allocator &al, const std::string &s) : -#ifdef WITH_LFORTRAN_BINARY_MODFILES - BinaryReader(s), -#else - TextReader(s), -#endif - DeserializationBaseVisitor(al, true) {} - - bool read_bool() { - uint8_t b = read_int8(); - return (b == 1); - } - - char* read_cstring() { - std::string s = read_string(); - LFortran::Str cs; - cs.from_str_view(s); - char* p = cs.c_str(al); - return p; - } -}; - -AST::ast_t* deserialize_ast(Allocator &al, const std::string &s) { - ASTDeserializationVisitor v(al, s); - return v.deserialize_node(); -} - - -} // namespace LFortran diff --git a/src/lpython/ast_serialization.h b/src/lpython/ast_serialization.h deleted file mode 100644 index 8c5a13ed05..0000000000 --- a/src/lpython/ast_serialization.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef LFORTRAN_SERIALIZATION_H -#define LFORTRAN_SERIALIZATION_H - -#include -#include - -namespace LFortran { - - std::string serialize(const AST::ast_t &ast); - std::string serialize(const AST::TranslationUnit_t &unit); - AST::ast_t* deserialize_ast(Allocator &al, const std::string &s); - -} - -#endif // LFORTRAN_SERIALIZATION_H diff --git a/src/lpython/ast_to_openmp.cpp b/src/lpython/ast_to_openmp.cpp deleted file mode 100644 index ad17959cfa..0000000000 --- a/src/lpython/ast_to_openmp.cpp +++ /dev/null @@ -1,964 +0,0 @@ -#include - -#include - -using LFortran::AST::expr_t; -using LFortran::AST::Name_t; -using LFortran::AST::Num_t; -using LFortran::AST::BinOp_t; -using LFortran::AST::operatorType; -using LFortran::AST::BaseVisitor; - - -namespace LFortran { - -namespace { - - std::string op2str(const operatorType type) - { - switch (type) { - case (operatorType::Add) : return " + "; - case (operatorType::Sub) : return " - "; - case (operatorType::Mul) : return "*"; - case (operatorType::Div) : return "/"; - case (operatorType::Pow) : return "**"; - } - throw std::runtime_error("Unknown type"); - } - - inline std::string convert_to_lowercase(const std::string &s) { - std::string res; - for(auto x: s) res.push_back(std::tolower(x)); - return res; - } - -} - -namespace AST { - -class ASTToOPENMPVisitor : public BaseVisitor -{ -public: - std::string s; - bool use_colors; - int indent_level; -public: - ASTToOPENMPVisitor() : use_colors{false}, indent_level{0} { } - void visit_TranslationUnit(const TranslationUnit_t &/* x */) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("translationunit"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - s.append("Unimplementedobject"); - s.append(")"); - } - void visit_Module(const Module_t &x) { - std:: string r = ""; - r.append("module"); - r.append(" "); - r.append(x.m_name); - r.append("\n"); - for (size_t i=0; ivisit_unit_decl1(*x.m_use[i]); - r.append(s); - if (i < x.n_use-1) r.append("\n"); - } - r.append("\n"); - for (size_t i=0; ivisit_unit_decl2(*x.m_decl[i]); - r.append(s); - if (i < x.n_decl-1) r.append("\n"); - } - r.append("\n"); - for (size_t i=0; ivisit_program_unit(*x.m_contains[i]); - r.append(s); - if (i < x.n_contains-1) r.append("\n"); - } - r.append("\nend module "); - r.append(x.m_name); - r.append("\n"); - s = r; - } - void visit_Program(const Program_t &x) { - std::string r = "program "; - r.append(x.m_name); - r.append("\n"); - for (size_t i=0; ivisit_unit_decl1(*x.m_use[i]); - r.append(s); - r.append("\n"); - } - for (size_t i=0; ivisit_unit_decl2(*x.m_decl[i]); - r.append(s); - r.append("\n"); - } - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - r.append("\n"); - } - if (x.n_contains > 0) { - for (size_t i=0; ivisit_program_unit(*x.m_contains[i]); - r.append(s); - r.append("\n"); - } - } - r.append("end program "); - r.append(x.m_name); - r.append("\n"); - s = r; - } - void visit_Subroutine(const Subroutine_t &x) { - std::string r = "subroutine "; - r.append(x.m_name); - if (x.n_args > 0) { - r.append("("); - for (size_t i=0; ivisit_arg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append(")"); - } - r.append("\n"); - for (size_t i=0; ivisit_unit_decl1(*x.m_use[i]); - r.append(s); - r.append("\n"); - } - for (size_t i=0; ivisit_unit_decl2(*x.m_decl[i]); - r.append(s); - r.append("\n"); - } - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - r.append("\n"); - } - if (x.n_contains > 0) { - r.append("contains\n"); - for (size_t i=0; ivisit_program_unit(*x.m_contains[i]); - r.append(s); - r.append("\n"); - } - } - r.append("end subroutine "); - r.append(x.m_name); - r.append("\n"); - s = r; - } - - void visit_Use(const Use_t &x) { - std::string r = "use "; - r.append(x.m_module); - if (x.n_symbols > 0) { - r.append(", only: "); - for (size_t i=0; ivisit_use_symbol(*x.m_symbols[i]); - r.append(s); - if (i < x.n_symbols-1) r.append(", "); - } - } - s = r; - } - - void visit_Declaration(const Declaration_t &x) { - std::string r = ""; - if (x.m_vartype == nullptr && - x.n_attributes == 1 && - is_a(*x.m_attributes[0]) && - down_cast(x.m_attributes[0])->m_attr == - simple_attributeType::AttrParameter) { - // The parameter statement is printed differently than other - // attributes - r += "parameter"; - r += "("; - for (size_t i=0; i(*x.m_attributes[0])) { - // The namelist statement is printed differently than other - // atttributes - r.append("namelist"); - r.append(" /"); - r += down_cast(x.m_attributes[0])->m_name; - r.append("/ "); - for (size_t i=0; i 0) r.append(", "); - } - for (size_t i=0; i 0) { - r.append(" :: "); - for (size_t i=0; i 0) { - r.append("("); - for (size_t i=0; i 0) { - r.append("("); - - // Determine proper canonical printing of kinds - // TODO: Move this part into a separate AST pass - kind_item_t k[2]; - LFORTRAN_ASSERT(x.n_kind <= 2); - for (size_t i=0; ivisit_expr(*value); - return s; - case (AST::kind_item_typeType::Colon) : - return ":"; - case (AST::kind_item_typeType::Star) : - return "*"; - default : - throw LFortranException("Unknown type"); - } - } - - - void visit_Interface(const Interface_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("interface"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - s.append(AST::down_cast(x.m_header)->m_name); - s.append(" "); - s.append("Unimplementedidentifier"); - s.append(")"); - } - void visit_Assignment(const Assignment_t &x) { - std::string r = ""; - this->visit_expr(*x.m_target); - r.append(s); - r.append(" = "); - this->visit_expr(*x.m_value); - r.append(s); - s = r; - } - void visit_Associate(const Associate_t &x) { - std::string r = ""; - this->visit_expr(*x.m_target); - r.append(s); - r.append(" => "); - this->visit_expr(*x.m_value); - r.append(s); - s = r; - } - void visit_SubroutineCall(const SubroutineCall_t &x) { - std::string r = "call "; - r.append(x.m_name); - r.append("("); - for (size_t i=0; ivisit_expr(*x.m_args[i].m_end); - r.append(s); - if (i < x.n_args-1) r.append(" "); - } - r.append(")"); - s = r; - } - void visit_If(const If_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("if"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - this->visit_expr(*x.m_test); - s.append(" "); - s.append("["); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - if (i < x.n_body-1) s.append(" "); - } - s.append("]"); - s.append(" "); - s.append("["); - for (size_t i=0; ivisit_stmt(*x.m_orelse[i]); - if (i < x.n_orelse-1) s.append(" "); - } - s.append("]"); - s.append(")"); - } - void visit_Where(const Where_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("where"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - this->visit_expr(*x.m_test); - s.append(" "); - s.append("["); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - if (i < x.n_body-1) s.append(" "); - } - s.append("]"); - s.append(" "); - s.append("["); - for (size_t i=0; ivisit_stmt(*x.m_orelse[i]); - if (i < x.n_orelse-1) s.append(" "); - } - s.append("]"); - s.append(")"); - } - void visit_Stop(const Stop_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("stop"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - if (x.m_code) { - this->visit_expr(*x.m_code); - } else { - s.append("()"); - } - s.append(")"); - } - void visit_ErrorStop(const ErrorStop_t &/* x */) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("errorstop"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(")"); - } - void visit_DoLoop(const DoLoop_t &x) { - std::string r = "do"; - if (x.m_var) { - r.append(" "); - r.append(x.m_var); - r.append(" = "); - } - if (x.m_start) { - this->visit_expr(*x.m_start); - r.append(s); - r.append(", "); - } - if (x.m_end) { - this->visit_expr(*x.m_end); - r.append(s); - } - if (x.m_increment) { - r.append(", "); - this->visit_expr(*x.m_increment); - r.append(s); - } - r.append("\n"); - indent_level += 4; - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - for (int i=0; i < indent_level; i++) r.append(" "); - r.append(s); - r.append("\n"); - } - indent_level -= 4; - r.append("end do"); - s = r; - } - //Converts do concurrent to a regular do loop. Adds OpenMP pragmas. - void visit_DoConcurrentLoop(const DoConcurrentLoop_t &x) { - if (x.n_control != 1) { - throw LFortranException("Do concurrent: exactly one control statement is implemented for now"); - } - AST::ConcurrentControl_t &h = *(AST::ConcurrentControl_t*) x.m_control[0]; - AST::ConcurrentReduce_t *red=nullptr; - for (size_t i=0; i < x.n_locality; i++) { - if (x.m_locality[i]->type == AST::concurrent_localityType::ConcurrentReduce) { - red = (AST::ConcurrentReduce_t*) x.m_locality[i]; - break; - } - } - - std::string r = ""; - if (red) - { - LFORTRAN_ASSERT(red->n_vars == 1) - r.append("!$OMP DO REDUCTION("); - //This will need expanded - if (red->m_op == AST::reduce_opType::ReduceAdd) { - r.append("+"); - } else if (red->m_op == AST::reduce_opType::ReduceMIN) { - r.append("MIN"); //Is this right? Check later. - } - r.append(":"); - r.append(red->m_vars[0]); - r.append(")\n"); - } else { - r.append("!$OMP PARALLEL DO\n"); - } - r.append("do "); - if (h.m_var) { -// r.append(" ("); - r.append(h.m_var); - r.append(" = "); - } - if (h.m_start) { - this->visit_expr(*h.m_start); - r.append(s); - r.append(":"); - } - if (h.m_end) { - this->visit_expr(*h.m_end); - r.append(s); - } - if (h.m_increment) { - r.append(":"); - this->visit_expr(*h.m_increment); - r.append(s); - } -// r.append(")\n"); - r.append("\n"); - indent_level += 4; - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - for (int i=0; i < indent_level; i++) r.append(" "); - r.append(s); - r.append("\n"); - } - indent_level -= 4; - r.append("end do\n"); - if (red) - r.append("!$OMP END DO"); - else - r.append("!$OMP END PARALLEL DO"); - s = r; - } - void visit_Cycle(const Cycle_t &/* x */) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("cycle"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(")"); - } - void visit_Exit(const Exit_t &/* x */) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("exit"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(")"); - } - void visit_Return(const Return_t &/* x */) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("return"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(")"); - } - void visit_WhileLoop(const WhileLoop_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("while"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - this->visit_expr(*x.m_test); - s.append(" "); - s.append("["); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - if (i < x.n_body-1) s.append(" "); - } - s.append("]"); - s.append(")"); - } - void visit_Print(const Print_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("print"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - if (x.m_fmt) { - this->visit_expr(*x.m_fmt); - } else { - s.append("()"); - } - s.append(" "); - s.append("["); - for (size_t i=0; ivisit_expr(*x.m_values[i]); - if (i < x.n_values-1) s.append(" "); - } - s.append("]"); - s.append(")"); - } - void visit_BoolOp(const BoolOp_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("boolop"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - this->visit_expr(*x.m_left); - s.append(" "); - s.append("boolopType" + std::to_string(x.m_op)); - s.append(" "); - this->visit_expr(*x.m_right); - s.append(")"); - } - void visit_BinOp(const BinOp_t &x) { - this->visit_expr(*x.m_left); - std::string left = std::move(s); - this->visit_expr(*x.m_right); - std::string right = std::move(s); - s = "(" + left + ")" + op2str(x.m_op) + "(" + right + ")"; - } - void visit_UnaryOp(const UnaryOp_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("unaryop"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - s.append("unaryopType" + std::to_string(x.m_op)); - s.append(" "); - this->visit_expr(*x.m_operand); - s.append(")"); - } - void visit_Compare(const Compare_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("compare"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - this->visit_expr(*x.m_left); - s.append(" "); - s.append("cmpopType" + std::to_string(x.m_op)); - s.append(" "); - this->visit_expr(*x.m_right); - s.append(")"); - } - void visit_FuncCallOrArray(const FuncCallOrArray_t &x) { - std::string r = ""; - r.append(x.m_func); - r.append("("); - for (size_t i=0; ivisit_expr(*x.m_args[i].m_end); - r.append(s); - if (i < x.n_args-1) s.append(", "); - } - for (size_t i=0; ivisit_keyword(x.m_keywords[i]); - r.append(s); - if (i < x.n_keywords-1) r.append(", "); - } - r.append(")"); - s = r; - } - void visit_ArrayInitializer(const ArrayInitializer_t &x) { - std::string r = "["; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append("]"); - s = r; - } - void visit_Num(const Num_t &x) { - s = std::to_string(x.m_n); - } - void visit_Real(const Real_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("real"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - s.append("\"" + std::string(x.m_n) + "\""); - s.append(")"); - } - void visit_String(const String_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("str"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - s.append("\"" + std::string(x.m_s) + "\""); - s.append(")"); - } - void visit_Name(const Name_t &x) { - s = std::string(x.m_id); - } - void visit_Logical(const Logical_t &/* x */) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("constant"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - s.append("Unimplementedconstant"); - s.append(")"); - } - - void visit_dimension(const dimension_t &x) { - std::string r = ""; - if (x.m_start) { - this->visit_expr(*x.m_start); - r.append(s); - } else { - r.append(""); - } - r.append(":"); - if (x.m_end) { - this->visit_expr(*x.m_end); - r.append(s); - } else { - r.append(""); - } - s = r; - } - void visit_arg(const arg_t &x) { - s = std::string(x.m_arg); - } - void visit_keyword(const keyword_t &x) { - s.append("("); - if (x.m_arg) { - s.append(x.m_arg); - } else { - s.append("()"); - } - s.append(" "); - this->visit_expr(*x.m_value); - s.append(")"); - } - void visit_ArrayIndex(const ArrayIndex_t &x) { - s.append("("); - if (use_colors) { - s.append(color(style::bold)); - s.append(color(fg::magenta)); - } - s.append("arrayindex"); - if (use_colors) { - s.append(color(fg::reset)); - s.append(color(style::reset)); - } - s.append(" "); - if (x.m_left) { - this->visit_expr(*x.m_left); - } else { - s.append("()"); - } - s.append(" "); - if (x.m_right) { - this->visit_expr(*x.m_right); - } else { - s.append("()"); - } - s.append(" "); - if (x.m_step) { - this->visit_expr(*x.m_step); - } else { - s.append("()"); - } - s.append(")"); - } - void visit_UseSymbol(const UseSymbol_t &x) { - s = ""; - if (x.m_local_rename) { - s.append(x.m_local_rename); - s.append(" => "); - } - s.append(x.m_remote_sym); - } -}; - -} - -std::string ast_to_openmp(LFortran::AST::ast_t &ast) { - AST::ASTToOPENMPVisitor v; - v.visit_ast(ast); - return v.s; -} - -} diff --git a/src/lpython/ast_to_openmp.h b/src/lpython/ast_to_openmp.h deleted file mode 100644 index 01ab2f96fb..0000000000 --- a/src/lpython/ast_to_openmp.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef LFORTRAN_AST_TO_OPENMP_H -#define LFORTRAN_AST_TO_OPENMP_H - -#include - -namespace LFortran { - - // Converts AST to Fortran source code with OpenMP parallel pragmas - std::string ast_to_openmp(LFortran::AST::ast_t &ast); - -} - -#endif // LFORTRAN_AST_TO_OPENMP_H diff --git a/src/lpython/ast_to_src.cpp b/src/lpython/ast_to_src.cpp deleted file mode 100644 index 223b5274a5..0000000000 --- a/src/lpython/ast_to_src.cpp +++ /dev/null @@ -1,4419 +0,0 @@ -#include -#include -#include -#include - -using LFortran::AST::expr_t; -using LFortran::AST::Name_t; -using LFortran::AST::Num_t; -using LFortran::AST::BinOp_t; -using LFortran::AST::operatorType; -using LFortran::AST::BaseVisitor; -using LFortran::AST::StrOp_t; - - -namespace LFortran { - -namespace { - - std::string op2str(const operatorType type) - { - switch (type) { - case (operatorType::Add) : return " + "; - case (operatorType::Sub) : return " - "; - case (operatorType::Mul) : return "*"; - case (operatorType::Div) : return "/"; - case (operatorType::Pow) : return "**"; - } - throw LFortranException("Unknown type"); - } - - std::string boolop2str(const AST::boolopType type) - { - switch (type) { - case (AST::boolopType::And) : return " .and. "; - case (AST::boolopType::Or) : return " .or. "; - case (AST::boolopType::Xor) : return " .xor. "; - case (AST::boolopType::Eqv) : return " .eqv. "; - case (AST::boolopType::NEqv) : return " .neqv. "; - } - throw LFortranException("Unknown type"); - } - - std::string cmpop2str(const AST::cmpopType type) - { - switch (type) { - case (AST::cmpopType::Eq) : return " == "; - case (AST::cmpopType::Gt) : return " > "; - case (AST::cmpopType::GtE) : return " >= "; - case (AST::cmpopType::Lt) : return " < "; - case (AST::cmpopType::LtE) : return " <= "; - case (AST::cmpopType::NotEq) : return " /= "; - } - throw LFortranException("Unknown type"); - } - - std::string strop2str(const AST::stroperatorType type) - { - switch (type) { - case (AST::stroperatorType::Concat) : return " // "; - } - throw LFortranException("Unknown type"); - } - - std::string intrinsicop2str(const AST::intrinsicopType type) - { - switch (type) { - case (AST::intrinsicopType::AND) : return ".and."; - case (AST::intrinsicopType::OR) : return ".or."; - case (AST::intrinsicopType::XOR) : return ".xor."; - case (AST::intrinsicopType::EQV) : return ".eqv."; - case (AST::intrinsicopType::NEQV) : return ".neqv."; - case (AST::intrinsicopType::PLUS) : return "+"; - case (AST::intrinsicopType::MINUS) : return "-"; - case (AST::intrinsicopType::STAR) : return "*"; - case (AST::intrinsicopType::DIV) : return "/"; - case (AST::intrinsicopType::POW) : return "**"; - case (AST::intrinsicopType::NOT) : return ".not."; - case (AST::intrinsicopType::EQ) : return "=="; - case (AST::intrinsicopType::GT) : return ">"; - case (AST::intrinsicopType::GTE) : return ">="; - case (AST::intrinsicopType::LT) : return "<"; - case (AST::intrinsicopType::LTE) : return "<="; - case (AST::intrinsicopType::NOTEQ) : return "/="; - case (AST::intrinsicopType::CONCAT) : return "//"; - } - throw LFortranException("Unknown type"); - } - - std::string symbol2str(const AST::symbolType type) - { - switch (type) { - case (AST::symbolType::None) : return ""; - case (AST::symbolType::Arrow) : return " => "; - case (AST::symbolType::Equal) : return " = "; - case (AST::symbolType::Asterisk) : return "*"; - case (AST::symbolType::DoubleAsterisk) : return "*(*)"; - case (AST::symbolType::Slash) : return "/"; - } - throw LFortranException("Unknown type"); - } -} - -namespace AST { - -class ASTToSRCVisitor : public BaseVisitor -{ -public: - std::string s; - bool use_colors; - int indent_level; - std::string indent; - int indent_spaces; - bool indent_unit; - // The precedence of the last expression, using the table - // 10.1 in the Fortran 2018 standard: - int last_expr_precedence; - - // Syntax highlighting groups - enum gr { - // Type - UnitHeader, // program, end program - Type, // integer, real, character, complex - - // Constant - String, // "some string" - Integer, // 234 - Real, // 5.5_dp - Logical, // .true., .false. - Complex, // (7,8) - - // Functions - Call, // call - Intrinsic, // exp, sin, cos - - // Statements - Conditional, // if, then, else, end if, where, select case - Repeat, // do, while, forall - Keyword, // any other keyword: print - - // Operators - Operator, - - // Reset - Reset, // resets any previously set formatting - }; - std::string syn_reset; - -public: - ASTToSRCVisitor(bool color, int indent, bool indent_unit) - : use_colors{color}, indent_level{0}, - indent_spaces{indent}, indent_unit{indent_unit} - { } - - std::string syn(const gr &g=gr::Reset) { - std::string syn_color; - if (use_colors) { - switch (g) { - case (gr::UnitHeader) : { - syn_color = color(fgB::cyan); - syn_reset = color(fg::reset); - break; - } - - case (gr::Type) : { - syn_color = color(fgB::green); - syn_reset = color(fg::reset); - break; - } - - case (gr::String) : - case (gr::Integer) : - case (gr::Real) : - case (gr::Logical) : - case (gr::Complex) : { - syn_color = color(fg::magenta); - syn_reset = color(fg::reset); - break; - } - - case (gr::Call) : - case (gr::Intrinsic) : { - syn_color = color(fgB::cyan) + color(style::bold); - syn_reset = color(fg::reset) + color(style::reset); - break; - } - - case (gr::Conditional) : - case (gr::Repeat) : - case (gr::Keyword) : { - syn_color = color(fg::yellow); - syn_reset = color(fg::reset); - break; - } - - case (gr::Operator) : { - syn_color = color(fg::blue) + color(style::bold); - syn_reset = color(fg::reset) + color(style::reset); - break; - } - - case (gr::Reset) : { - syn_color = syn_reset; - syn_reset = ""; - break; - } ; - - default : { - throw LFortranException("Syntax Group not implemented"); - } - } - } - return syn_color; - } - - void inc_indent() { - indent_level++; - indent = std::string(indent_level*indent_spaces, ' '); - } - - void dec_indent() { - indent_level--; - indent = std::string(indent_level*indent_spaces, ' '); - } - - std::string print_trivia_inside(const trivia_t &x) { - std::string r; - auto y = (TriviaNode_t &)x; - if(y.n_inside > 0) { - for (size_t i=0; itype) { - case trivia_nodeType::Comment: { - r += std::string( - down_cast(y.m_inside[i])->m_comment - ); - r += "\n"; - break; - } - case trivia_nodeType::EOLComment: { - r += " "; - r += std::string( - down_cast(y.m_inside[i])->m_comment - ); - r += "\n"; - break; - } - case trivia_nodeType::EndOfLine: { - r += "\n"; - break; - } - case trivia_nodeType::Semicolon: { - r += "; "; - break; - } - } - } - } else { - return "\n"; - } - return r; - } - - std::string print_trivia_after(const trivia_t &x) { - std::string r; - auto y = (TriviaNode_t &)x; - if(y.n_after > 0) { - for (size_t i=0; itype) { - case trivia_nodeType::Comment: { - r += std::string( - down_cast(y.m_after[i])->m_comment - ); - r += "\n"; - break; - } - case trivia_nodeType::EOLComment: { - r += " "; - r += std::string( - down_cast(y.m_after[i])->m_comment - ); - r += "\n"; - break; - } - case trivia_nodeType::EndOfLine: { - r += "\n"; - break; - } - case trivia_nodeType::Semicolon: { - r += "; "; - break; - } - } - } - } else { - return "\n"; - } - return r; - } - - void visit_TranslationUnit(const TranslationUnit_t &x) { - std::string r; - for (size_t i=0; ivisit_ast(*x.m_items[i]); - r += s; - if (i < x.n_items-1) { - if (is_a(*x.m_items[i]) || ( - ( is_a(*x.m_items[i]) - || is_a(*x.m_items[i]) - ) && - ( is_a(*x.m_items[i+1]) - || is_a(*x.m_items[i+1]) - ) - ) - ) { - r.append("\n"); - } - } - } - s = r; - } - - void visit_Module(const Module_t &x) { - std::string r = ""; - r += syn(gr::UnitHeader); - r.append("module"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - - r += format_unit_body(x); - - r += syn(gr::UnitHeader); - r.append("end module"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - void visit_Submodule(const Submodule_t &x) { - std::string r = ""; - r += syn(gr::UnitHeader); - r.append("submodule"); - r += syn(); - r += " ("; - r.append(x.m_id); - if(x.m_parent_name) { - r += ":"; - r.append(x.m_parent_name); - } - r += ") "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - if (indent_unit) inc_indent(); - if(x.n_use > 0) { - for (size_t i=0; ivisit_unit_decl1(*x.m_use[i]); - r.append(s); - } - r.append("\n"); - } - if(x.n_decl > 0) { - for (size_t i=0; ivisit_unit_decl2(*x.m_decl[i]); - r.append(s); - } - r.append("\n"); - } - if (x.n_contains > 0) { - r += "\n"; - r += syn(gr::UnitHeader); - r.append("contains"); - r += syn(); - r += "\n\n"; - inc_indent(); - for (size_t i=0; ivisit_program_unit(*x.m_contains[i]); - r.append(s); - r.append("\n"); - } - dec_indent(); - } - if (indent_unit) dec_indent(); - r += syn(gr::UnitHeader); - r.append("end submodule"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_BlockData(const BlockData_t &x) { - std::string r = indent; - r += syn(gr::UnitHeader); - r += "block data"; - r += syn(); - if(x.m_name) { - r += " "; - r.append(x.m_name); - } - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_unit_decl1(*x.m_use[i]); - r.append(s); - } - r += format_implicit(x); - for (size_t i=0; ivisit_unit_decl2(*x.m_decl[i]); - r.append(s); - } - dec_indent(); - r += indent; - r += syn(gr::UnitHeader); - r.append("end block data"); - r += syn(); - if(x.m_name) { - r += " "; - r.append(x.m_name); - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Program(const Program_t &x) { - std::string r; - r += syn(gr::UnitHeader); - r.append("program"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - - r += format_unit_body(x); - r += syn(gr::UnitHeader); - r.append("end program"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Subroutine(const Subroutine_t &x) { - std::string r = indent; - for (size_t i=0; ivisit_arg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append(")"); - if (x.m_bind) { - r.append(" "); - this->visit_bind(*x.m_bind); - r.append(s); - } - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - - r += format_unit_body(x, !indent_unit); - r += indent; - r += syn(gr::UnitHeader); - r.append("end subroutine"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Procedure(const Procedure_t &x) { - std::string r = indent; - for (size_t i=0; ivisit_arg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append(")"); - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - - r += format_unit_body(x, !indent_unit); - r += indent; - r += syn(gr::UnitHeader); - r.append("end procedure"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_DerivedType(const DerivedType_t &x) { - std::string r = indent; - r += syn(gr::UnitHeader); - r.append("type"); - r += syn(); - for (size_t i=0; ivisit_decl_attribute(*x.m_attrtype[i]); - r.append(s); - if (i < x.n_attrtype-1) r.append(", "); - } - r.append(" :: "); - r.append(x.m_name); - for (size_t i=0; ivisit_procedure_decl(*x.m_contains[i]); - r.append(s); - // r.append("\n"); - } - } - r += syn(gr::UnitHeader); - r.append(indent + "end type "); - r += syn(); - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - void visit_DerivedTypeProc(const DerivedTypeProc_t &x) { - std::string r; - r += syn(gr::String); - r.append("procedure"); - r += syn(); - if (x.m_name) { - r += "("; - r.append(x.m_name); - r += ")"; - } - for (size_t i=0; ivisit_decl_attribute(*x.m_attr[i]); - r.append(s); - if (i < x.n_attr-1) r.append(", "); - } - r.append(" :: "); - for (size_t i=0; ivisit_use_symbol(*x.m_symbols[i]); - r.append(s); - if (i < x.n_symbols-1) r.append(", "); - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - void visit_GenericOperator(const GenericOperator_t &x) { - std::string r; - r += syn(gr::String); - r.append("generic"); - r += syn(); - if(x.n_attr > 0 && x.m_attr[0] != nullptr){ - r += ", "; - this->visit_decl_attribute(*x.m_attr[0]); - r.append(s); - } - r += " :: operator(" + intrinsicop2str(x.m_op) + ")"; - r += " => "; - for (size_t i=0; i 0 && x.m_attr[0] != nullptr){ - r += ", "; - this->visit_decl_attribute(*x.m_attr[0]); - r.append(s); - } - r += " :: operator("; - r += syn(gr::Operator); - r += "." + std::string(x.m_optype) + "."; - r += syn(); - r += ")"; - r += " => "; - for (size_t i=0; i 0 && x.m_attr[0] != nullptr){ - r += ", "; - this->visit_decl_attribute(*x.m_attr[0]); - r.append(s); - } - r += " :: assignment(=) => "; - for (size_t i=0; i 0 && x.m_attr[0] != nullptr){ - r += ", "; - this->visit_decl_attribute(*x.m_attr[0]); - r.append(s); - } - r += " :: "; - r.append(x.m_name); - r += " => "; - for (size_t i=0; i 0 && x.m_attr[0] != nullptr){ - r += ", "; - this->visit_decl_attribute(*x.m_attr[0]); - r.append(s); - } - r += " :: "; - r += "write("; - r.append(x.m_id); - r += ")"; - r += " => "; - for (size_t i=0; i 0 && x.m_attr[0] != nullptr){ - r += ", "; - this->visit_decl_attribute(*x.m_attr[0]); - r.append(s); - } - r += " :: "; - r += "read("; - r.append(x.m_id); - r += ")"; - r += " => "; - for (size_t i=0; ivisit_decl_attribute(*x.m_attr[i]); - r.append(s); - } - } - - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_unit_decl2(*x.m_items[i]); - r.append(s); - } - dec_indent(); - r += syn(gr::UnitHeader); - r.append("end enum"); - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Interface(const Interface_t &x) { - std::string r; - if(x.m_header->type == AbstractInterfaceHeader) { - r += "abstract "; - } - r += syn(gr::UnitHeader); - r.append("interface"); - r += syn(); - this->visit_interface_header(*x.m_header); - r.append(s); - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_interface_item(*x.m_items[i]); - r.append(s); - } - dec_indent(); - r += syn(gr::UnitHeader); - r.append("end interface"); - r += syn(); - this->visit_interface_header(*x.m_header); - r.append(s); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_InterfaceHeader(const InterfaceHeader_t &/* x */) { - s = ""; - } - - void visit_InterfaceHeaderName(const InterfaceHeaderName_t &x) { - s = " "; - s += x.m_name; - } - - void visit_InterfaceHeaderAssignment - (const InterfaceHeaderAssignment_t &/* x */) { - s = " assignment (=)"; - } - - void visit_InterfaceHeaderOperator - (const InterfaceHeaderOperator_t &x) { - s = " operator (" + intrinsicop2str(x.m_op) + ")"; - } - - void visit_InterfaceHeaderDefinedOperator - (const InterfaceHeaderDefinedOperator_t &x) { - s = " operator ("; - s += syn(gr::Operator); - s += "." + std::string(x.m_operator_name) + "."; - s += syn(); - s += ")"; - } - - void visit_AbstractInterfaceHeader - (const AbstractInterfaceHeader_t &/* x */) { - s = ""; - } - - void visit_InterfaceHeaderWrite(const InterfaceHeaderWrite_t &x) { - s = " write("; - s.append(x.m_id); - s += ")"; - } - void visit_InterfaceHeaderRead(const InterfaceHeaderRead_t &x) { - s = " read("; - s.append(x.m_id); - s += ")"; - } - - void visit_InterfaceModuleProcedure(const InterfaceModuleProcedure_t &x) { - std::string r = indent; - for (size_t i=0; ivisit_program_unit(*x.m_proc); - r.append(s); - s = r; - } - - template - std::string format_import(const T &x) { - std::string r; - for (size_t i=0; ivisit_import_statement(*x.m_import[i]); - r.append(s); - } - return r; - } - - std::string format_import(const Program_t &/*x*/) { - return ""; - } - - std::string format_import(const Module_t &/*x*/) { - return ""; - } - - template - std::string format_implicit(const T &x) { - std::string r; - for (size_t i=0; ivisit_implicit_statement(*x.m_implicit[i]); - r.append(s); - } - return r; - } - - template - std::string format_body(const T &x) { - std::string r; - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - return r; - } - - std::string format_body(const Module_t &/*x*/) { - return ""; - } - - - template - std::string format_unit_body(const T &x, bool indent_contains=false) { - std::string r; - if (indent_unit) inc_indent(); - for (size_t i=0; ivisit_unit_decl1(*x.m_use[i]); - r.append(s); - } - r += format_import(x); - r += format_implicit(x); - for (size_t i=0; ivisit_unit_decl2(*x.m_decl[i]); - r.append(s); - } - r += format_body(x); - if (x.n_contains > 0) { - r += "\n"; - r += syn(gr::UnitHeader); - if (indent_unit) dec_indent(); - r.append(indent + "contains"); - if (indent_unit) inc_indent(); - r += syn(); - r += "\n\n"; - if (indent_contains) inc_indent(); - for (size_t i=0; ivisit_program_unit(*x.m_contains[i]); - r.append(s); - r.append("\n"); - } - if (indent_contains) dec_indent(); - } - if (indent_unit) dec_indent(); - return r; - } - - void visit_Function(const Function_t &x) { - std::string r = indent; - for (size_t i=0; ivisit_arg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append(")"); - if (x.m_return_var) { - r += " "; - r += syn(gr::UnitHeader); - r.append("result"); - r += syn(); - r += "("; - this->visit_expr(*x.m_return_var); - r.append(s); - r.append(")"); - } - if (x.m_bind) { - r.append(" "); - this->visit_bind(*x.m_bind); - r.append(s); - } - if(x.m_trivia){ - r += print_trivia_inside(*x.m_trivia); - } else { - r.append("\n"); - } - - r += format_unit_body(x, !indent_unit); - r += indent; - r += syn(gr::UnitHeader); - r.append("end function"); - r += syn(); - r += " "; - r.append(x.m_name); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Use(const Use_t &x) { - std::string r = indent; - r += syn(gr::UnitHeader); - r += "use"; - r += syn(); - for (size_t i=0; ivisit_decl_attribute(*x.m_nature[i]); - r.append(s); - r += " ::"; - } - r += " "; - r.append(x.m_module); - if (x.m_only_present || x.n_symbols > 0) { - r.append(", "); - } - if (x.m_only_present) { - r += syn(gr::UnitHeader); - r += "only"; - r += syn(); - r += ":"; - if (x.n_symbols > 0) r.append(" "); - } - for (size_t i=0; ivisit_use_symbol(*x.m_symbols[i]); - r.append(s); - if (i < x.n_symbols-1) r.append(", "); - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Import(const Import_t &x) { - std::string r = indent; - r += syn(gr::UnitHeader); - r += "import"; - r += syn(); - if (x.m_mod == import_modifierType::ImportNone) { - r.append(", "); - r += syn(gr::UnitHeader); - r += "none"; - r += syn(); - } else if (x.m_mod == import_modifierType::ImportOnly) { - r.append(", "); - r += syn(gr::UnitHeader); - r += "only"; - r += syn(); - r += ":"; - } else if (x.m_mod == import_modifierType::ImportAll) { - r.append(", "); - r += syn(gr::UnitHeader); - r += "all"; - r += syn(); - } else if (x.m_mod == import_modifierType::ImportDefault) { - if (x.n_symbols) r += " ::"; - } - if (x.n_symbols > 0) { - r += " "; - for (size_t i=0; i 0) { - r += " ("; - for (size_t i=0; i 0) { - r += " ("; - for (size_t i=0; i 0) { - r += " ("; - for (size_t i=0; i(*x.m_attributes[0]) && - down_cast(x.m_attributes[0])->m_attr == - simple_attributeType::AttrParameter) { - // The parameter statement is printed differently than other - // attributes - r += syn(gr::Type); - r += "parameter"; - r += syn(); - r += "("; - for (size_t i=0; i(*x.m_attributes[0])) { - // The namelist statement is printed differently than other - // atttributes - r += syn(gr::Type); - r.append("namelist"); - r += syn(); - r.append(" /"); - r += down_cast(x.m_attributes[0])->m_name; - r.append("/ "); - for (size_t i=0; i(*x.m_attributes[0]) && - down_cast(x.m_attributes[0])->m_attr - == simple_attributeType::AttrCommon) { - visit_Common(x); - r.append(s); - } else { - if (x.m_vartype) { - visit_decl_attribute(*x.m_vartype); - r += s; - if (x.n_attributes > 0) r.append(", "); - } - for (size_t i=0; itype == decl_attributeType::AttrData - && i == 0 ){ - r += syn(gr::Type); - r += "data "; - r += syn(); - } - visit_decl_attribute(*x.m_attributes[i]); - r += s; - if (i < x.n_attributes-1) r.append(", "); - } - if (x.n_syms > 0) { - r.append(" :: "); - for (size_t i=0; i 0) { - r.append("("); - for (size_t i=0; i 0) { - r.append("["); - for (size_t i=0; ivisit_decl_attribute(*x.m_spec); - r.append(s); - } - s = r; - } - - void visit_Common(const Declaration_t &x) { - std::string r; - r += syn(gr::Type); - r += "common "; - r += syn(); - for (size_t i=0; ivisit_expr(*x.m_object[i]); - r.append(s); - if (i < x.n_object-1) r.append(", "); - } - r += "/"; - for (size_t i=0; ivisit_expr(*x.m_value[i]); - r.append(s); - if (i < x.n_value-1) r.append(", "); - } - r += "/"; - s = r; - } - - void visit_DataImpliedDo(const DataImpliedDo_t &x) { - std::string r; - r += "("; - for (size_t i=0; ivisit_expr(*x.m_object_list[i]); - r.append(s); - if (i < x.n_object_list-1) r.append(", "); - } - r += ", "; - if (x.m_type) { - this->visit_decl_attribute(*x.m_type); - r.append(s); - r += " :: "; - } - r.append(x.m_var); - r += " = "; - this->visit_expr(*x.m_start); - r.append(s); - r += ", "; - this->visit_expr(*x.m_end); - r.append(s); - if (x.m_increment) { - r += ", "; - this->visit_expr(*x.m_increment); - r.append(s); - } - r += ")"; - s = r; - last_expr_precedence = 13; - } - - void visit_AttrEquivalence(const AttrEquivalence_t &x) { - std::string r; - r += syn(gr::Type); - r += "equivalence "; - r += syn(); - for (size_t i=0; ivisit_equi(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - s = r; - } - - void visit_equi(const equi_t &x) { - std::string r; - r += "("; - for (size_t i=0; ivisit_expr(*x.m_set_list[i]); - r.append(s); - if (i < x.n_set_list-1) r.append(", "); - } - r += ")"; - s = r; - } -#define ATTRTYPE(x) \ - case (simple_attributeType::Attr##x) : \ - r.append(to_lower(#x)); \ - break; - - void visit_SimpleAttribute(const SimpleAttribute_t &x) { - std::string r; - r += syn(gr::Type); - switch (x.m_attr) { - ATTRTYPE(Abstract) - ATTRTYPE(Allocatable) - ATTRTYPE(Asynchronous) - ATTRTYPE(Contiguous) - ATTRTYPE(Deferred) - ATTRTYPE(Elemental) - ATTRTYPE(Enumerator) - ATTRTYPE(External) - ATTRTYPE(Impure) - ATTRTYPE(Intrinsic) - ATTRTYPE(Kind) - ATTRTYPE(Len) - ATTRTYPE(Module) - ATTRTYPE(NoPass) - ATTRTYPE(NonDeferred) - ATTRTYPE(Non_Intrinsic) - ATTRTYPE(Optional) - ATTRTYPE(Parameter) - ATTRTYPE(Pointer) - ATTRTYPE(Private) - ATTRTYPE(Protected) - ATTRTYPE(Public) - ATTRTYPE(Pure) - ATTRTYPE(Recursive) - ATTRTYPE(Save) - ATTRTYPE(Sequence) - ATTRTYPE(Target) - ATTRTYPE(Value) - ATTRTYPE(Volatile) - default : - throw LFortranException("Attribute type not implemented"); - } - r += syn(); - s = r; - } - -#define ATTRTYPE2(x, y) \ - case (decl_typeType::Type##x) : \ - r.append(y); \ - break; - - void visit_AttrType(const AttrType_t &x) { - std::string r; - r += syn(gr::Type); - switch (x.m_type) { - ATTRTYPE2(Class, "class") - ATTRTYPE2(Character, "character") - ATTRTYPE2(Complex, "complex") - ATTRTYPE2(DoublePrecision, "double precision") - ATTRTYPE2(Integer, "integer") - ATTRTYPE2(Logical, "logical") - ATTRTYPE2(Procedure, "procedure") - ATTRTYPE2(Real, "real") - ATTRTYPE2(Type, "type") - default : - throw LFortranException("Attribute type not implemented"); - } - r += syn(); - if (x.n_kind > 0) { - r.append("("); - - // Determine proper canonical printing of kinds - // TODO: Move this part into a separate AST pass - kind_item_t k[2]; - LFORTRAN_ASSERT(x.n_kind <= 2); - for (size_t i=0; i 0) { - r += "("; - for (size_t i=0; i 0) { - r += "["; - for (size_t i=0; ivisit_expr(*x.m_value); - r.append(s); - s = r; - } - - void visit_AttrEventWaitKwArg(const AttrEventWaitKwArg_t &x) { - std::string r = ""; - r.append(x.m_id); - r += " = "; - this->visit_expr(*x.m_value); - r.append(s); - s = r; - } - - void visit_Assign(const Assign_t &x) { - std::string r = indent; - r += print_label(x); - r.append("assign"); - r += " " + std::to_string(x.m_assign_label); - r += " to "; - r += x.m_variable; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Assignment(const Assignment_t &x) { - std::string r = indent; - r += print_label(x); - this->visit_expr(*x.m_target); - r.append(s); - r.append(" = "); - this->visit_expr(*x.m_value); - r.append(s); - if (x.m_trivia) { - r += print_trivia_after(*x.m_trivia); - } else { - r += "\n"; - } - s = r; - } - - void visit_GoTo(const GoTo_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Call); - r += "go to"; - r += syn(); - r.append(" "); - if (x.m_int_var) { - r += x.m_int_var; - } - if(x.n_labels > 0) { - if (x.m_int_var) r += ", "; - r += "("; - for (size_t i=0; ivisit_expr(*x.m_labels[i]); - r.append(s); - if (i < x.n_labels-1) r.append(", "); - } - r += ")"; - if (x.m_goto_label) r += ", "; - - } - if (x.m_goto_label) { - this->visit_expr(*x.m_goto_label); - r.append(s); - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Associate(const Associate_t &x) { - std::string r = indent; - r += print_label(x); - this->visit_expr(*x.m_target); - r.append(s); - r.append(" => "); - this->visit_expr(*x.m_value); - r.append(s); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_SubroutineCall(const SubroutineCall_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Call); - r += "call"; - r += syn(); - r += " "; - for (size_t i=0; ivisit_expr(*start); - r.append(s); - } - r += ":"; - if (end) { - this->visit_expr(*end); - r.append(s); - } - if (is_a(*step) && - down_cast(step)->m_n != 1) { - r += ":"; - this->visit_expr(*step); - r.append(s); - } - } else if (end != nullptr && start == nullptr) { - this->visit_expr(*end); - r.append(s); - } else { - throw LFortranException("Incorrect array elements"); - } - r += ")"; - } - r.append("%"); - } - r.append(x.m_name); - r.append("("); - for (size_t i=0; ivisit_expr(*x.m_args[i].m_end); - r.append(s); - } else { - r += ":"; - } - if (i < x.n_args-1) r.append(", "); - else if (x.n_keywords > 0) r.append(", "); - } - for (size_t i=0; ivisit_keyword(x.m_keywords[i]); - r.append(s); - if (i < x.n_keywords-1) r.append(", "); - } - r.append(")"); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Allocate(const Allocate_t &x) { - std::string r = indent; - r.append("allocate"); - r.append("("); - for (size_t i=0; ivisit_expr(*x.m_args[i].m_start); - r.append(s); - r += ":"; - } - if (x.m_args[i].m_end) { - this->visit_expr(*x.m_args[i].m_end); - r.append(s); - } else { - r += ":"; - } - if (x.m_args[i].m_step) { - this->visit_expr(*x.m_args[i].m_step); - r.append(s); - } - if (i < x.n_args-1) r.append(", "); - } - if (x.n_keywords > 0) r.append(", "); - for (size_t i=0; ivisit_expr(*x.m_keywords[i].m_value); - r.append(s); - if (i < x.n_keywords-1) r.append(", "); - } - r.append(")"); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Deallocate(const Deallocate_t &x) { - std::string r = indent; - r += print_label(x); - r.append("deallocate"); - r.append("("); - for (size_t i=0; ivisit_expr(*x.m_args[i].m_start); - r.append(s); - } - if (x.m_args[i].m_end) { - this->visit_expr(*x.m_args[i].m_end); - r.append(s); - } else { - r += ":"; - } - if (x.m_args[i].m_step) { - this->visit_expr(*x.m_args[i].m_step); - r.append(s); - } - if (i < x.n_args-1) r.append(", "); - } - if (x.n_keywords > 0) r.append(", "); - for (size_t i=0; ivisit_expr(*x.m_keywords[i].m_value); - r.append(s); - if (i < x.n_keywords-1) r.append(", "); - } - r.append(")"); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_If(const If_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Conditional); - r += "if"; - r += syn(); - r += " ("; - this->visit_expr(*x.m_test); - r += s; - r += ") "; - r += syn(gr::Conditional); - r += "then"; - r += syn(); - if(x.m_if_trivia){ - r += print_trivia_after(*x.m_if_trivia); - } else if(x.m_else_trivia) { - r += print_trivia_inside(*x.m_else_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - if (x.n_orelse > 0) { - r += indent; - r += syn(gr::Conditional); - r += "else"; - r += syn(); - if(x.m_else_trivia){ - r += print_trivia_after(*x.m_else_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_orelse[i]); - r += s; - } - dec_indent(); - } - r += indent; - r += syn(gr::Conditional); - r += "end if"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_IfArithmetic(const IfArithmetic_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Conditional); - r += "if"; - r += syn(); - r += " ("; - this->visit_expr(*x.m_test); - r += s; - r += ") "; - r += std::to_string(x.m_lt_label); - r += ", " + std::to_string(x.m_eq_label); - r += ", " + std::to_string(x.m_gt_label); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Where(const Where_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Repeat); - r += "where"; - r += syn(); - r += " ("; - this->visit_expr(*x.m_test); - r += s; - r += ")"; - if(x.m_t_inside){ - r += print_trivia_inside(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - if (x.n_orelse > 0) { - r += indent; - r += syn(gr::Conditional); - r += "else where"; - r += syn(); - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_orelse[i]); - r += s; - } - dec_indent(); - } - r += indent; - r += syn(gr::Repeat); - r += "end where"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Entry(const Entry_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("entry"); - r += syn(); - r += " "; - r.append(x.m_name); - r.append("("); - for (size_t i=0; ivisit_arg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append(")"); - if (x.m_return_var) { - r += " "; - r += syn(gr::UnitHeader); - r.append("result"); - r += syn(); - r += "("; - this->visit_expr(*x.m_return_var); - r.append(s); - r.append(")"); - } - if (x.m_bind) { - r.append(" "); - this->visit_bind(*x.m_bind); - r.append(s); - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Stop(const Stop_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("stop"); - r += syn(); - if (x.m_code) { - this->visit_expr(*x.m_code); - r += " " + s; - } - if (x.m_quiet) { - this->visit_expr(*x.m_quiet); - r += ", quiet = " + s; - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_ErrorStop(const ErrorStop_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("error stop"); - r += syn(); - if (x.m_code) { - this->visit_expr(*x.m_code); - r += " " + s; - } - if (x.m_quiet) { - this->visit_expr(*x.m_quiet); - r += ", quiet = " + s; - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_EventPost(const EventPost_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("event post"); - r += syn(); - r += " ("; - this->visit_expr(*x.m_variable); - r.append(s); - if (x.m_stat) { - r += ", "; - for (size_t i=0; ivisit_event_attribute(*x.m_stat[i]); - r.append(s); - } - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_EventWait(const EventWait_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("event wait"); - r += syn(); - r += " ("; - this->visit_expr(*x.m_variable); - r.append(s); - if (x.m_spec) { - r += ", "; - for (size_t i=0; ivisit_event_attribute(*x.m_spec[i]); - r.append(s); - if (i < x.n_spec-1) r.append(", "); - } - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_SyncAll(const SyncAll_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("sync all"); - r += syn(); - if (x.m_stat) { - r += " ("; - for (size_t i=0; ivisit_event_attribute(*x.m_stat[i]); - r.append(s); - if (i < x.n_stat-1) r.append(", "); - } - r += ")"; - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_SyncImages(const SyncImages_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("sync images"); - r += syn(); - r += "("; - if (x.m_image_set) { - this->visit_expr(*x.m_image_set); - r.append(s); - } - if(x.m_sym == Asterisk) { - r += symbol2str(x.m_sym); - } - for (size_t i=0; ivisit_event_attribute(*x.m_stat[i]); - r.append(s); - if (i < x.n_stat-1) r.append(", "); - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_SyncMemory(const SyncMemory_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("sync memory"); - r += syn(); - if (x.m_stat) { - r += "("; - for (size_t i=0; ivisit_event_attribute(*x.m_stat[i]); - r.append(s); - if (i < x.n_stat-1) r.append(", "); - } - r += ")"; - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_SyncTeam(const SyncTeam_t &x) { - std::string r = indent; - r += print_label(x); - r += syn(gr::Keyword); - r.append("sync team"); - r += syn(); - r += "("; - this->visit_expr(*x.m_value); - r.append(s); - for (size_t i=0; ivisit_event_attribute(*x.m_stat[i]); - r.append(s); - if (i < x.n_stat-1) r.append(", "); - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_DoLoop(const DoLoop_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Repeat); - r += "do"; - r += syn(); - if (x.m_var) { - r.append(" "); - r.append(x.m_var); - r.append(" = "); - } - if (x.m_start) { - this->visit_expr(*x.m_start); - r.append(s); - r.append(", "); - } - if (x.m_end) { - this->visit_expr(*x.m_end); - r.append(s); - } - if (x.m_increment) { - r.append(", "); - this->visit_expr(*x.m_increment); - r.append(s); - } - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - dec_indent(); - r += indent; - r += syn(gr::Repeat); - r.append("end do"); - r += syn(); - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_ImpliedDoLoop(const ImpliedDoLoop_t &x) { - std::string r = ""; - r += "("; - for (size_t i=0; ivisit_expr(*x.m_values[i]); - r.append(s); - r.append(", "); - } - r.append(x.m_var); - r.append(" = "); - this->visit_expr(*x.m_start); - r.append(s); - r.append(", "); - this->visit_expr(*x.m_end); - r.append(s); - if (x.m_increment) { - r.append(", "); - this->visit_expr(*x.m_increment); - r.append(s); - } - r.append(")"); - s = r; - last_expr_precedence = 13; - } - - void visit_assoc(const var_sym_t &x) { - std::string r = ""; - r.append(x.m_name); - if (x.n_dim > 0) { - r.append("("); - for (size_t i=0; ivisit_assoc(x.m_syms[i]); - r.append(s); - if (i < x.n_syms-1) r.append(", "); - } - r.append(")"); - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - dec_indent(); - r += syn(gr::UnitHeader); - r.append("end associate"); - r += syn(); - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Block(const Block_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::UnitHeader); - r += "block"; - r += syn(); - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_unit_decl1(*x.m_use[i]); - r.append(s); - } - r += format_import(x); - for (size_t i=0; ivisit_unit_decl2(*x.m_decl[i]); - r.append(s); - } - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - dec_indent(); - r += indent; - r += syn(gr::UnitHeader); - r.append("end block"); - r += syn(); - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_ChangeTeam(const ChangeTeam_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::UnitHeader); - r += "change team"; - r += syn(); - r += "("; - this->visit_expr(*x.m_team_value); - r.append(s); - for (size_t i=0; ivisit_team_attribute(*x.m_coarray_assoc[i]); - r.append(s); - if (i < x.n_coarray_assoc-1) r.append(", "); - } - for (size_t i=0; ivisit_event_attribute(*x.m_sync[i]); - r.append(s); - if (i < x.n_sync-1) r.append(", "); - } - r += ")"; - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - dec_indent(); - r += indent; - r += syn(gr::UnitHeader); - r.append("end team"); - r += syn(); - if (x.m_sync_stat) { - r += " ("; - for (size_t i=0; ivisit_event_attribute(*x.m_sync_stat[i]); - r.append(s); - if (i < x.n_sync_stat-1) r.append(", "); - } - r += ")"; - } - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_CoarrayAssociation(const CoarrayAssociation_t &x) { - std::string r = ""; - this->visit_expr(*x.m_coarray); - r.append(s); - r += " => "; - this->visit_expr(*x.m_selector); - r.append(s); - s = r; - } - - void visit_Critical(const Critical_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::UnitHeader); - r += "critical"; - r += syn(); - if (x.m_sync_stat) { - r += " ("; - for (size_t i=0; ivisit_event_attribute(*x.m_sync_stat[i]); - r.append(s); - } - r += ")"; - } - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - dec_indent(); - r += indent; - r += syn(gr::UnitHeader); - r.append("end critical"); - r += syn(); - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_DoConcurrentLoop(const DoConcurrentLoop_t &x) { - if (x.n_control != 1) { - throw LFortranException("Do concurrent: exactly one control statement is implemented for now"); - } - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Repeat); - r += "do concurrent"; - r += syn(); - - AST::ConcurrentControl_t &h = *(AST::ConcurrentControl_t*) x.m_control[0]; - r.append(" ("); - if (h.m_var) { - r.append(h.m_var); - r.append(" = "); - } - if (h.m_start) { - this->visit_expr(*h.m_start); - r.append(s); - r.append(":"); - } - if (h.m_end) { - this->visit_expr(*h.m_end); - r.append(s); - } - if (h.m_increment) { - r.append(":"); - this->visit_expr(*h.m_increment); - r.append(s); - } - r.append(")"); - if (x.m_mask) { - this->visit_expr(*x.m_mask); - r += s; - } - for (size_t i=0; ivisit_concurrent_locality(*x.m_locality[i]); - r.append(s); - } - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - dec_indent(); - r += indent; - r += syn(gr::Repeat); - r.append("end do"); - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_ForAll(const ForAll_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Repeat); - r += "forall"; - r += syn(); - r.append(" ("); - for (size_t i=0; ivisit_concurrent_control(*x.m_control[i]); - r.append(s); - if (i < x.n_control-1) r.append(", "); - } - if (x.m_mask) { - r += ", "; - this->visit_expr(*x.m_mask); - r += s; - } - r.append(")"); - for (size_t i=0; ivisit_concurrent_locality(*x.m_locality[i]); - r.append(s); - } - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r.append(s); - } - dec_indent(); - r += indent; - r += syn(gr::Repeat); - r.append("end forall"); - r += syn(); - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_ForAllSingle(const ForAllSingle_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Repeat); - r += "forall"; - r += syn(); - r.append(" ("); - for (size_t i=0; ivisit_concurrent_control(*x.m_control[i]); - r.append(s); - if (i < x.n_control-1) r.append(", "); - } - if (x.m_mask) { - r += ", "; - this->visit_expr(*x.m_mask); - r += s; - } - r.append(")"); - r.append("\n"); - inc_indent(); - this->visit_stmt(*x.m_assign); - r.append(s); - dec_indent(); - r += indent; - r += syn(gr::Repeat); - r.append("end forall"); - r += syn(); - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_ConcurrentControl(const ConcurrentControl_t &x) { - std::string r; - if (x.m_var) { - r.append(x.m_var); - r.append(" = "); - } - if (x.m_start) { - this->visit_expr(*x.m_start); - r.append(s); - r.append(":"); - } - if (x.m_end) { - this->visit_expr(*x.m_end); - r.append(s); - } - if (x.m_increment) { - r.append(":"); - this->visit_expr(*x.m_increment); - r.append(s); - } - s = r; - } - - void visit_ConcurrentLocal(const ConcurrentLocal_t &x) { - std::string r; - r += " local("; - for (size_t i=0; ivisit_expr(*x.m_value); - r += " " + s; - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_WhileLoop(const WhileLoop_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Repeat); - r += "do while"; - r += syn(); - r += " ("; - this->visit_expr(*x.m_test); - r += s; - r += ")"; - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - r += indent; - r += syn(gr::Repeat); - r += "end do"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Print(const Print_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "print"; - r += syn(); - r += " "; - if (x.m_fmt) { - this->visit_expr(*x.m_fmt); - r.append(s); - } else { - r += "*"; - } - if (x.n_values > 0) { - r += ", "; - for (size_t i=0; ivisit_expr(*x.m_values[i]); - r += s; - if (i < x.n_values-1) r += ", "; - } - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Write(const Write_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "write"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i].m_value); - r += s; - } - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - } - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if (x.n_values > 0) { - r += " "; - for (size_t i=0; ivisit_expr(*x.m_values[i]); - r += s; - if (i < x.n_values-1) r += ", "; - } - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Read(const Read_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "read"; - r += syn(); - if (x.m_format) { - r += " "; - this->visit_expr(*x.m_format); - r.append(s); - } - if(x.n_args || x.n_kwargs) { - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i].m_value); - r += s; - } - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - } - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - } else if(!x.m_format) { - r += " *,"; - } - if (x.n_values > 0) { - if (x.m_format) { - r += ","; - } - r += " "; - for (size_t i=0; ivisit_expr(*x.m_values[i]); - r += s; - if (i < x.n_values-1) r += ", "; - } - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Close(const Close_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "close"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Open(const Open_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "open"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Inquire(const Inquire_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "inquire"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if (x.n_values > 0) { - r += " "; - for (size_t i=0; ivisit_expr(*x.m_values[i]); - r += s; - if (i < x.n_values-1) r += ", "; - } - } - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Rewind(const Rewind_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "rewind"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Nullify(const Nullify_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "nullify"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Backspace(const Backspace_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "backspace"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Flush(const Flush_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "flush"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_Endfile(const Endfile_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "endfile"; - r += syn(); - r += "("; - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r += s; - if (i < x.n_args-1 || x.n_kwargs > 0) r += ", "; - } - for (size_t i=0; ivisit_expr(*x.m_kwargs[i].m_value); - r += s; - if (i < x.n_kwargs-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - template - std::string print_label(const Node &x) { - if (x.m_label == 0) { - return ""; - } else { - return std::to_string(x.m_label) + " "; - } - } - - template - std::string print_stmt_name(const Node &x) { - if (x.m_stmt_name == nullptr) { - return ""; - } else { - return std::string(x.m_stmt_name) + ": "; - } - } - - template - std::string end_stmt_name(const Node &x) { - if (x.m_stmt_name == nullptr) { - return ""; - } else { - return " " + std::string(x.m_stmt_name); - } - } - - void visit_Format(const Format_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "format"; - r += syn(); - r += "(" + std::string(x.m_fmt) + ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_FormTeam(const FormTeam_t &x) { - std::string r=indent; - r += print_label(x); - r += syn(gr::Keyword); - r += "form team"; - r += syn(); - r += "("; - this->visit_expr(*x.m_team_number); - r.append(s); - r += ", "; - r.append(x.m_team_var); - for (size_t i=0; ivisit_event_attribute(*x.m_sync_stat[i]); - r.append(s); - if (i < x.n_sync_stat-1) r.append(", "); - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_BoolOp(const BoolOp_t &x) { - this->visit_expr(*x.m_left); - std::string left = std::move(s); - int left_precedence = last_expr_precedence; - this->visit_expr(*x.m_right); - std::string right = std::move(s); - int right_precedence = last_expr_precedence; - switch (x.m_op) { - case (AST::boolopType::And) : { - last_expr_precedence = 4; - break; - } - case (AST::boolopType::Or) : { - last_expr_precedence = 3; - break; - } - case (AST::boolopType::Xor) : { - last_expr_precedence = 3; - break; - } - case (AST::boolopType::Eqv) : { - last_expr_precedence = 2; - break; - } - case (AST::boolopType::NEqv) : { - last_expr_precedence = 2; - break; - } - } - if (left_precedence >= last_expr_precedence) { - s += left; - } else { - s += "(" + left + ")"; - } - s += boolop2str(x.m_op); - if (right_precedence >= last_expr_precedence) { - s += right; - } else { - s += "(" + right + ")"; - } - } - - void visit_BinOp(const BinOp_t &x) { - this->visit_expr(*x.m_left); - std::string left = std::move(s); - int left_precedence = last_expr_precedence; - this->visit_expr(*x.m_right); - std::string right = std::move(s); - int right_precedence = last_expr_precedence; - switch (x.m_op) { - case (operatorType::Add) : { - last_expr_precedence = 8; - break; - } - case (operatorType::Sub) : { - last_expr_precedence = 8; - break; - } - case (operatorType::Mul) : { - last_expr_precedence = 10; - break; - } - case (operatorType::Div) : { - last_expr_precedence = 10; - break; - } - case (operatorType::Pow) : { - last_expr_precedence = 11; - break; - } - } - s = ""; - if (left_precedence == 9) { - s += "(" + left + ")"; - } else { - if (left_precedence >= last_expr_precedence) { - s += left; - } else { - s += "(" + left + ")"; - } - } - s += op2str(x.m_op); - if (right_precedence == 9) { - s += "(" + right + ")"; - } else if (x.m_op == operatorType::Sub) { - if (right_precedence > last_expr_precedence) { - s += right; - } else { - s += "(" + right + ")"; - } - } else { - if (right_precedence >= last_expr_precedence) { - s += right; - } else { - s += "(" + right + ")"; - } - } - } - - void visit_DefBinOp(const DefBinOp_t &x) { - this->visit_expr(*x.m_left); - std::string left = std::move(s); - int left_precedence = last_expr_precedence; - this->visit_expr(*x.m_right); - std::string right = std::move(s); - int right_precedence = last_expr_precedence; - last_expr_precedence = 1; - - if (left_precedence >= last_expr_precedence) { - s += left; - } else { - s += "(" + left + ")"; - } - s += syn(gr::Operator); - s += "." + std::string(x.m_op) + "."; - s += syn(); - if (right_precedence >= last_expr_precedence) { - s += right; - } else { - s += "(" + right + ")"; - } - } - - void visit_DefUnaryOp(const DefUnaryOp_t &x) { - this->visit_expr(*x.m_operand); - std::string right = std::move(s); - int right_precedence = last_expr_precedence; - last_expr_precedence = 12; - - s += "." + std::string(x.m_op) + "."; - if (right_precedence >= last_expr_precedence) { - s += right; - } else { - s += "(" + right + ")"; - } - } - - void visit_StrOp(const StrOp_t &x) { - this->visit_expr(*x.m_left); - std::string left = std::move(s); - int left_precedence = last_expr_precedence; - this->visit_expr(*x.m_right); - std::string right = std::move(s); - int right_precedence = last_expr_precedence; - last_expr_precedence = 7; - if (left_precedence >= last_expr_precedence) { - s += left; - } else { - s += "(" + left + ")"; - } - s += strop2str(x.m_op); - if (right_precedence >= last_expr_precedence) { - s += right; - } else { - s += "(" + right + ")"; - } - } - - void visit_UnaryOp(const UnaryOp_t &x) { - this->visit_expr(*x.m_operand); - int expr_precedence = last_expr_precedence; - if (x.m_op == AST::unaryopType::USub) { - last_expr_precedence = 9; - if (expr_precedence >= last_expr_precedence) { - s = "-" + s; - } else { - s = "-(" + s + ")"; - } - } else if (x.m_op == AST::unaryopType::UAdd) { - // Skip unary plus, keep the previous precedence - } else if (x.m_op == AST::unaryopType::Not) { - last_expr_precedence = 5; - if (expr_precedence >= last_expr_precedence) { - s = ".not. " + s; - } else { - s = ".not.(" + s + ")"; - } - } else { - throw LFortranException("Unary op type not implemented"); - } - } - - void visit_Compare(const Compare_t &x) { - this->visit_expr(*x.m_left); - std::string left = std::move(s); - int left_precedence = last_expr_precedence; - this->visit_expr(*x.m_right); - std::string right = std::move(s); - int right_precedence = last_expr_precedence; - last_expr_precedence = 6; - if (left_precedence >= last_expr_precedence) { - s += left; - } else { - s += "(" + left + ")"; - } - s += cmpop2str(x.m_op); - if (right_precedence >= last_expr_precedence) { - s += right; - } else { - s += "(" + right + ")"; - } - } - - void visit_FuncCallOrArray(const FuncCallOrArray_t &x) { - std::string r; - if (x.n_member > 0) { - for (size_t i=0; i 0) { - r.append("("); - for (size_t j=0; jvisit_expr(*end); - r.append(s); - } - if (start) {} - if (step) {} - if (i < x.m_member[i].n_args-1) r.append(","); - } - r.append(")"); - } - r.append("%"); - } - } - r.append(x.m_func); - r.append("("); - for (size_t i=0; ivisit_fnarg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - else if (x.n_keywords > 0) r.append(", "); - } - for (size_t i=0; ivisit_keyword(x.m_keywords[i]); - r.append(s); - if (i < x.n_keywords-1) r.append(", "); - } - r.append(")"); - for (size_t i=0; ivisit_fnarg(x.m_subargs[i]); - r.append(s); - if (i < x.n_subargs-1) r.append(", "); - r.append(")"); - } - s = r; - last_expr_precedence = 13; - } - - void visit_CoarrayRef(const CoarrayRef_t &x) { - std::string r; - if (x.n_member > 0) { - for (size_t i=0; i 0) { - r.append("("); - for (size_t j=0; jvisit_expr(*start); - r.append(s); - } - r += ":"; - if (end) { - this->visit_expr(*end); - r.append(s); - } - if (is_a(*step) && - down_cast(step)->m_n != 1) { - r += ":"; - this->visit_expr(*step); - r.append(s); - } - } else if (end != nullptr && start == nullptr) { - this->visit_expr(*end); - r.append(s); - } else { - throw LFortranException("Incorrect coarray elements"); - } - if (i < x.m_member[i].n_args-1) r.append(","); - } - r.append(")"); - } - r.append("%"); - } - } - r.append(x.m_name); - if(x.n_args > 0) { - r.append("("); - for (size_t i=0; ivisit_fnarg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - if (x.n_fnkw > 0) r.append(", "); - for (size_t i=0; ivisit_keyword(x.m_fnkw[i]); - r.append(s); - if (i < x.n_fnkw-1) r.append(", "); - } - r.append(")"); - } - r.append("["); - for (size_t i=0; ivisit_coarrayarg(x.m_coargs[i]); - r.append(s); - if (i < x.n_coargs-1) r.append(", "); - } - if (x.n_cokw > 0) r.append(", "); - for (size_t i=0; ivisit_keyword(x.m_cokw[i]); - r.append(s); - if (i < x.n_cokw-1) r.append(", "); - } - r.append("]"); - s = r; - last_expr_precedence = 13; - } - - void visit_ArrayInitializer(const ArrayInitializer_t &x) { - std::string r = "["; - if (x.m_vartype) { - this->visit_decl_attribute(*x.m_vartype); - r.append(s); - r += " :: "; - } else if (x.m_classtype) { - r.append(x.m_classtype); - r += " :: "; - } - for (size_t i=0; ivisit_expr(*x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append("]"); - s = r; - last_expr_precedence = 13; - } - - void visit_Num(const Num_t &x) { - s = syn(gr::Integer); - s += BigInt::int_to_str(x.m_n); - if (x.m_kind) { - s += "_"; - s += x.m_kind; - } - s += syn(); - last_expr_precedence = 13; - } - - void visit_Parenthesis(const Parenthesis_t &x) { - std::string r = "("; - this->visit_expr(*x.m_operand); - r.append(s); - r += ")"; - s = r; - last_expr_precedence = 13; - } - - void visit_Real(const Real_t &x) { - s = syn(gr::Real); - s += x.m_n; - s += syn(); - last_expr_precedence = 13; - } - - void check_quotes(const std::string r) { - s = syn(gr::String); - int dq = 0, sq = 0; - for (auto x: r) { - if (x == '"') dq++; - if (x == '\'') sq++; - } - if (dq > sq) { - s += "'"; - s += replace(r, "'", "''"); - s += "'"; - } else { - s += "\""; - s += replace(r, "\"", "\"\""); - s += "\""; - } - s += syn(); - } - - void visit_String(const String_t &x) { - check_quotes(x.m_s); - last_expr_precedence = 13; - } - - void visit_Substring(const Substring_t &x) { - std::string r; - check_quotes(x.m_s); - r = s; - r.append("("); - for (size_t i=0; ivisit_fnarg(x.m_args[i]); - r.append(s); - if (i < x.n_args-1) r.append(", "); - } - r.append(")"); - s = r; - last_expr_precedence = 13; - } - - void visit_BOZ(const BOZ_t &x) { - s = syn(gr::Integer); - s += "\"" + std::string(x.m_s) + "\""; - s += syn(); - last_expr_precedence = 13; - } - - - void visit_Complex(const Complex_t &x){ - std::string r; - s = syn(gr::Complex); - r += "("; - this->visit_expr(*x.m_re); - r.append(s); - r += ", "; - this->visit_expr(*x.m_im); - r.append(s); - r += ")"; - r += syn(); - s = r; - last_expr_precedence = 13; - } - - void visit_Name(const Name_t &x) { - std::string r = ""; - if (x.n_member > 0) { - for (size_t i=0; i 0) { - r.append("("); - for (size_t j=0; jvisit_expr(*start); - r.append(s); - } - r += ":"; - if (end) { - this->visit_expr(*end); - r.append(s); - } - if (is_a(*step) && - down_cast(step)->m_n != 1) { - r += ":"; - this->visit_expr(*step); - r.append(s); - } - } else if (end != nullptr && start == nullptr) { - this->visit_expr(*end); - r.append(s); - } else { - throw LFortranException("Incorrect array elements"); - } - if (i < x.m_member[i].n_args-1) r.append(","); - } - r.append(")"); - } - r.append("%"); - } - } - r.append(std::string(x.m_id)); - s = r; - last_expr_precedence = 13; - } - - void visit_Logical(const Logical_t &x) { - s = syn(gr::Logical); - if (x.m_value) { - s += ".true."; - } else { - s += ".false."; - } - s += syn(); - last_expr_precedence = 13; - } - - std::string kind_value(const AST::kind_item_typeType &type, - const AST::expr_t *value) - { - switch (type) { - case (AST::kind_item_typeType::Value) : - LFORTRAN_ASSERT(value != nullptr); - this->visit_expr(*value); - return s; - case (AST::kind_item_typeType::Colon) : - return ":"; - case (AST::kind_item_typeType::Star) : - return "*"; - default : - throw LFortranException("Unknown type"); - } - } - - void visit_dimension(const dimension_t &x) { - if (x.m_end_star == dimension_typeType::DimensionExpr) { - std::string left; - bool left_is_one=false; - if (x.m_start) { - this->visit_expr(*x.m_start); - left = s; - if (x.m_start->type == AST::exprType::Num) { - left_is_one = (AST::down_cast(x.m_start)->m_n == 1); - }; - } - std::string right; - if (x.m_end) { - this->visit_expr(*x.m_end); - right = s; - } - if (left_is_one && right != "") { - s = right; - } else { - s = left + ":" + right; - } - } else if (x.m_end_star == dimension_typeType::DimensionStar) { - if (x.m_start) { - this->visit_expr(*x.m_start); - s += ":*"; - } else { - s = "*"; - } - } else { - LFORTRAN_ASSERT(x.m_end_star == dimension_typeType::AssumedRank); - s = ".."; - } - } - - void visit_codimension(const codimension_t &x) { - if (x.m_end_star == codimension_typeType::CodimensionExpr) { - std::string left; - bool left_is_one=false; - if (x.m_start) { - this->visit_expr(*x.m_start); - left = s; - if (x.m_start->type == AST::exprType::Num) { - left_is_one = (AST::down_cast(x.m_start)->m_n == 1); - }; - } - std::string right; - if (x.m_end) { - this->visit_expr(*x.m_end); - right = s; - } - if (left_is_one && right != "") { - s = right; - } else { - s = left + ":" + right; - } - } else { - LFORTRAN_ASSERT(x.m_end_star == codimension_typeType::CodimensionStar); - if (x.m_start) { - this->visit_expr(*x.m_start); - s += ":*"; - } else { - s = "*"; - } - } - } - - void visit_arg(const arg_t &x) { - s = std::string(x.m_arg); - } - - void visit_keyword(const keyword_t &x) { - std::string r; - r += x.m_arg; - r += "="; - this->visit_expr(*x.m_value); - r += s; - s = r; - } - - void visit_fnarg(const fnarg_t &x) { - std::string r; - if (x.m_step) { - // Array section - if (x.m_start) { - this->visit_expr(*x.m_start); - r += s; - } - r += ":"; - if (x.m_end) { - this->visit_expr(*x.m_end); - r += s; - } - if (is_a(*x.m_step) && down_cast(x.m_step)->m_n == 1) { - // Nothing, a:b:1 is printed as a:b - } else { - r += ":"; - this->visit_expr(*x.m_step); - r += s; - } - } else { - // Array element - LFORTRAN_ASSERT(x.m_end); - LFORTRAN_ASSERT(!x.m_start); - this->visit_expr(*x.m_end); - r = s; - } - s = r; - } - - void visit_coarrayarg(const coarrayarg_t &x) { - std::string r; - if (x.m_step) { - // Array section - if (x.m_start) { - this->visit_expr(*x.m_start); - r += s; - } - if(x.m_star == codimension_typeType::CodimensionStar) { - r += "*"; - } else { - r += ":"; - } - if (x.m_end) { - this->visit_expr(*x.m_end); - r += s; - } - if (is_a(*x.m_step) && down_cast(x.m_step)->m_n == 1) { - // Nothing, a:b:1 is printed as a:b - } else { - r += ":"; - this->visit_expr(*x.m_step); - r += s; - } - } else { - // Array element - LFORTRAN_ASSERT(x.m_end); - LFORTRAN_ASSERT(!x.m_start); - this->visit_expr(*x.m_end); - r = s; - } - s = r; - } - - void visit_Bind(const Bind_t &x) { - std::string r; - r += syn(gr::UnitHeader); - r.append("bind"); - r += syn(); - r += "("; - for (size_t i=0; i 0) r.append(", "); - } - for (size_t i=0; ivisit_expr(*x.m_left); - r += s; - } - r.append(":"); - if (x.m_right) { - this->visit_expr(*x.m_right); - r += s; - } - if (x.m_step) { - r.append(":"); - this->visit_expr(*x.m_step); - r += s; - }; - s = r; - } - - void visit_UseSymbol(const UseSymbol_t &x) { - s = ""; - if (x.m_local_rename) { - s.append(x.m_local_rename); - s.append(" => "); - } - s.append(x.m_remote_sym); - } - - void visit_UseAssignment(const UseAssignment_t & /*x*/) { - s = "assignment (=)"; - } - - void visit_IntrinsicOperator(const IntrinsicOperator_t &x) { - s = "operator (" + intrinsicop2str(x.m_op) + ")"; - } - - void visit_RenameOperator(const RenameOperator_t &x) { - s = "operator("; - s += syn(gr::Operator); - s += "." + std::string(x.m_local_defop) + "."; - s += syn(); - s += ")"; - s += " => "; - s += "operator("; - s += syn(gr::Operator); - s += "." + std::string(x.m_use_defop) + "."; - s += syn(); - s += ")"; - } - - void visit_DefinedOperator(const DefinedOperator_t &x) { - s = "operator ("; - s += syn(gr::Operator); - s += "." + std::string(x.m_opName) + "."; - s += syn(); - s += ")"; - } - - void visit_UseWrite(const UseWrite_t &x) { - s = "write("; - s.append(x.m_id); - s += ")"; - } - void visit_UseRead(const UseRead_t &x) { - s = "read("; - s.append(x.m_id); - s += ")"; - } - - - void visit_Select(const Select_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Conditional); - r += "select case"; - r += syn(); - r += " ("; - this->visit_expr(*x.m_test); - r += s; - r += ")"; - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_case_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - r += indent; - r += syn(gr::Conditional); - r += "end select"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_CaseStmt(const CaseStmt_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "case"; - r += syn(); - r += " ("; - for (size_t i=0; ivisit_case_cond(*x.m_test[i]); - r += s; - if (i < x.n_test-1) r += ", "; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - - void visit_CaseCondExpr(const CaseCondExpr_t &x) { - this->visit_expr(*x.m_cond); - } - - void visit_CaseCondRange(const CaseCondRange_t &x) { - std::string r; - if (x.m_start) { - this->visit_expr(*x.m_start); - r += s; - } - r.append(":"); - if (x.m_end) { - this->visit_expr(*x.m_end); - r += s; - } - s = r; - } - - void visit_CaseStmt_Default(const CaseStmt_Default_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "case default"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - - void visit_SelectRank(const SelectRank_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Conditional); - r += "select rank"; - r += syn(); - r += " ("; - if (x.m_assoc_name) { - r.append(x.m_assoc_name); - r += "=>"; - } - this->visit_expr(*x.m_selector); - r += s; - r += ")"; - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_rank_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - r += syn(gr::Conditional); - r += "end select"; - r += syn(); - r += end_stmt_name(x); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_RankExpr(const RankExpr_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "rank"; - r += syn(); - r += " ("; - this->visit_expr(*x.m_value); - r.append(s); - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - - void visit_RankStar(const RankStar_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "rank"; - r += syn(); - r += " (*)"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - - void visit_RankDefault(const RankDefault_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "rank default"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - - void visit_SelectType(const SelectType_t &x) { - std::string r = indent; - r += print_label(x); - r += print_stmt_name(x); - r += syn(gr::Conditional); - r += "select type"; - r += syn(); - r += " ("; - if (x.m_assoc_name) { - r.append(x.m_assoc_name); - r += "=>"; - } - this->visit_expr(*x.m_selector); - r += s; - r += ")"; - if(x.m_t_inside){ - r += print_trivia_after(*x.m_t_inside); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_type_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - r += syn(gr::Conditional); - r += "end select"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - s = r; - } - - void visit_TypeStmtName(const TypeStmtName_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "type is"; - r += syn(); - r += " ("; - if (x.m_name) { - r.append(x.m_name); - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - void visit_TypeStmtType(const TypeStmtType_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "type is"; - r += syn(); - r += " ("; - if (x.m_vartype) { - this->visit_decl_attribute(*x.m_vartype); - r += s; - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - void visit_ClassStmt(const ClassStmt_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "class is"; - r += syn(); - r += " ("; - if (x.m_id) { - r.append(x.m_id); - } - r += ")"; - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } - void visit_ClassDefault(const ClassDefault_t &x) { - std::string r = indent; - r += syn(gr::Conditional); - r += "class default"; - r += syn(); - if(x.m_trivia){ - r += print_trivia_after(*x.m_trivia); - } else { - r.append("\n"); - } - inc_indent(); - for (size_t i=0; ivisit_stmt(*x.m_body[i]); - r += s; - } - dec_indent(); - s = r; - } -}; - -} - -std::string ast_to_src(AST::TranslationUnit_t &ast, bool color, int indent, - bool indent_unit) { - AST::ASTToSRCVisitor v(color, indent, indent_unit); - v.visit_ast((AST::ast_t &)ast); - return v.s; -} - -} diff --git a/src/lpython/ast_to_src.h b/src/lpython/ast_to_src.h deleted file mode 100644 index c687e692a5..0000000000 --- a/src/lpython/ast_to_src.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef LFORTRAN_AST_TO_SRC_H -#define LFORTRAN_AST_TO_SRC_H - -#include - -namespace LFortran { - - // Converts AST to Fortran source code - std::string ast_to_src(AST::TranslationUnit_t &ast, bool color=false, - int indent=4, bool indent_unit=false); - -} - -#endif // LFORTRAN_AST_TO_SRC_H diff --git a/src/lpython/mod_to_asr.cpp b/src/lpython/mod_to_asr.cpp deleted file mode 100644 index a43451fb10..0000000000 --- a/src/lpython/mod_to_asr.cpp +++ /dev/null @@ -1,367 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - - -namespace LFortran { - -using ASR::down_cast; -using ASR::down_cast2; - -int uncompress_gzip(uint8_t *out, uint64_t *out_size, uint8_t *in, - uint64_t in_size) -{ - // The code below is roughly equivalent to: - // return uncompress(out, out_size, in, in_size); - // except that it enables gzip support in inflateInit2(). - int zlib_status; - z_stream strm; - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - strm.next_in = in; - strm.avail_in = in_size; - zlib_status = inflateInit2(&strm, 15 | 32); - if (zlib_status < 0) return zlib_status; - strm.next_out = out; - strm.avail_out = *out_size; - zlib_status = inflate(&strm, Z_NO_FLUSH); - inflateEnd(&strm); - *out_size = *out_size - strm.avail_out; - return zlib_status; -} - -std::string extract_gzip(std::vector &buffer) -{ - std::vector data(1024*1024); - uint64_t data_size = data.size(); - int res = uncompress_gzip(&data[0], &data_size, &buffer[0], buffer.size()); - switch(res) { - case Z_OK: - case Z_STREAM_END: - break; - case Z_MEM_ERROR: - throw LFortranException("ZLIB: out of memory"); - case Z_BUF_ERROR: - throw LFortranException("ZLIB: output buffer was not large enough"); - case Z_DATA_ERROR: - throw LFortranException("ZLIB: the input data was corrupted or incomplete"); - default: - throw LFortranException("ZLIB: unknown error (" + std::to_string(res) + ")"); - } - return std::string((char*) &data[0], data_size); -} - -// 'abc' -> abc -std::string str_(const std::string &s) -{ - return s.substr(1, s.size()-2); -} - - -std::vector tokenize(const std::string &s) { - return split(replace(replace(s, "\\(", " ( "), "\\)", " ) ")); -} - -struct Item { - enum { - list, str, integer, token - } kind; - std::string s; - uint64_t i; - std::vector l; -}; - -#define EXPECT(arg_i, arg_kind) \ - if ((arg_i).kind != (arg_kind)) { \ - throw LFortranException("Unexpected item kind"); \ - } - -uint64_t item_integer(const Item &i) -{ - EXPECT(i, Item::integer); - return i.i; -} - -const std::string& item_string(const Item &i) -{ - EXPECT(i, Item::str); - return i.s; -} - -const std::string& item_token(const Item &i) -{ - EXPECT(i, Item::token); - return i.s; -} - -const std::vector& item_list(const Item &i) -{ - EXPECT(i, Item::list); - return i.l; -} - -Item read_from_tokens(const std::vector &tokens, size_t &pos) -{ - if (pos == tokens.size()) { - throw LFortranException("Unexpected EOF while reading"); - } - std::string token = tokens[pos]; - LFORTRAN_ASSERT(token.size() > 0); - pos++; - if (token == "(") { - Item r; - r.kind = Item::list; - while (tokens[pos] != ")") { - r.l.push_back(read_from_tokens(tokens, pos)); - } - pos++; // pop off ')' - return r; - } else if (token == ")") { - throw LFortranException("Unexpected )"); - } else { - Item r; - if (token[0] == '\'') { - r.kind = Item::str; - r.s = str_(token); - } else if (token[0] >= '0' && token[0] <= '9') { - r.kind = Item::integer; - r.i = std::stoi(token); - } else { - r.kind = Item::token; - r.s = token; - } - return r; - } -} - - - -Item parse(const std::string &source) -{ - size_t pos = 0; - return read_from_tokens(tokenize(source), pos); -} - -std::string format_item(const Item &i) -{ - if (i.kind == Item::str) { - return "\"" + i.s + "\""; - } else if (i.kind == Item::integer) { - return std::to_string(i.i); - } else if (i.kind == Item::token) { - return i.s; - } else { - LFORTRAN_ASSERT(i.kind == Item::list); - std::string s; - s += "("; - for (size_t j=0; j info; - Item info; - enum { - variable, procedure, module - } kind; - struct { - int intent; - bool dummy; - ASR::ttype_t *type; - ASR::symbol_t *var; - } v; - struct { - // type - std::vector arg_ids; - uint64_t return_sym_id; - ASR::symbol_t *proc; - } p; -}; - -ASR::ttype_t* parse_type(Allocator &al, const std::vector &l) -{ - LFORTRAN_ASSERT(l.size() == 7); - std::string name = item_token(l[0]); - if (name == "INTEGER") { - Location loc; - ASR::asr_t *t = ASR::make_Integer_t(al, loc, 4, nullptr, 0); - return down_cast(t); - } else { - throw LFortranException("Type not supported yet"); - } -} - -ASR::TranslationUnit_t* parse_gfortran_mod_file(Allocator &al, const std::string &s) -{ - std::vector s2 = split(s); - int version = std::atoi(&str_(s2[3])[0]); - if (version != 14) { - throw LFortranException("Only GFortran module version 14 is implemented so far"); - } - std::vector s3 = slice(s2, 7); - std::string s4 = "(" + join(" ", s3) + ")"; - - std::map gsymtab; - SymbolTable *parent_scope = al.make_new(nullptr); - - Item mod = parse(s4); - EXPECT(mod, Item::list); - if (mod.l.size() == 8) { - std::vector symtab = item_list(mod.l[6]); - if (symtab.size() % 6 != 0) { - throw LFortranException("Symtab not multiple of 6"); - } - for (size_t i=0; i < symtab.size(); i+=6) { - GSymbol s; - s.id = item_integer(symtab[i]); - s.name = item_string(symtab[i+1]); - s.module_name = item_string(symtab[i+2]); - s.info = symtab[i+5]; - s.is_public = false; - std::vector info = item_list(symtab[i+5]); - LFORTRAN_ASSERT(info.size() == 12); - std::vector info_sym_info = item_list(info[0]); - std::string kind = item_token(info_sym_info[0]); - if (kind == "VARIABLE") { - s.kind = GSymbol::variable; - std::vector sym_type = item_list(info[2]); - s.v.type = parse_type(al, sym_type); - Str a; - a.from_str_view(s.name); - char *name = a.c_str(al); - Location loc; - ASR::asr_t *asr = ASR::make_Variable_t(al, loc, nullptr, - name, ASR::intentType::In, nullptr, nullptr, - ASR::storage_typeType::Default, s.v.type, - ASR::abiType::GFortranModule, - ASR::Public, ASR::presenceType::Required, false); - s.v.var = down_cast(asr); - } else if (kind == "PROCEDURE") { - s.kind = GSymbol::procedure; - Location loc; - SymbolTable *proc_symtab = al.make_new(parent_scope); - Str a; - a.from_str_view(s.name); - char *name = a.c_str(al); - ASR::asr_t *asr = ASR::make_Subroutine_t(al, loc, - proc_symtab, name, nullptr, 0, - nullptr, 0, ASR::abiType::GFortranModule, ASR::Public, - ASR::Interface, nullptr, false, false); - s.p.proc = down_cast(asr); - std::string sym_name = s.name; - if (parent_scope->scope.find(sym_name) != parent_scope->scope.end()) { - throw LFortranException("Procedure already defined"); - } - parent_scope->scope[sym_name] = ASR::down_cast(asr); - - std::vector args = item_list(info[5]); - for (auto &arg : args) { - s.p.arg_ids.push_back(item_integer(arg)); - } - } else if (kind == "MODULE") { - s.kind = GSymbol::module; - } else { - throw LFortranException("Symbol kind not supported"); - } - - if (gsymtab.find(s.id) != gsymtab.end()) { - throw LFortranException("Symbol redeclared"); - } - gsymtab[s.id] = s; - } - - std::vector public_symbols = item_list(mod.l[7]); - if (public_symbols.size() % 3 != 0) { - throw LFortranException("Public symbols list not multiple of 3"); - } - for (size_t i=0; i < public_symbols.size(); i+=3) { - std::string symbol_name = item_string(public_symbols[i]); - uint64_t ambiguous_flag = item_integer(public_symbols[i+1]); - uint64_t symbol_id = item_integer(public_symbols[i+2]); - if (ambiguous_flag != 0) { - throw LFortranException("Ambiguous symbols not supported yet"); - } - if (gsymtab.find(symbol_id) == gsymtab.end()) { - throw LFortranException("Public symbol not defined in the symbol table"); - } - gsymtab[symbol_id].is_public = true; - if (gsymtab[symbol_id].name != symbol_name) { - throw LFortranException("Public symbol name mismatch"); - } - } - } else { - throw LFortranException("Unexpected number of items"); - } - - /* - std::cout << "Symbol table" << std::endl; - for (auto &item : gsymtab) { - std::cout << item.second.id << " " << item.second.name << " " << item.second.module_name << " " << item.second.is_public << " "; - std::cout << format_item(item.second.info) << std::endl; - //std::cout << item.second.kind << std::endl; - if (item.second.kind == GSymbol::procedure) { - for (auto &arg : item.second.p.arg_ids) { - std::cout << arg << " " << gsymtab[arg].name << " "; - } - std::cout << std::endl; - } - } - */ - - - ASR::asr_t *asr; - Location loc; - asr = ASR::make_TranslationUnit_t(al, loc, - parent_scope, nullptr, 0); - ASR::TranslationUnit_t *tu = down_cast2(asr); - LFORTRAN_ASSERT(asr_verify(*tu)); - return tu; - - //std::cout << format_item(mod); - - //std::cout << s; -} - -ASR::TranslationUnit_t *mod_to_asr(Allocator &al, std::string filename) -{ - std::ifstream in(filename, std::ios::binary); - std::vector buffer(std::istreambuf_iterator(in), {}); - std::string s; - if (buffer.size() > 2 && buffer[0] == 0x1f && buffer[1] == 0x8b) { - // GZip format - s = extract_gzip(buffer); - } else { - // Assuming plain text - s = std::string((char*) &buffer[0], buffer.size()); - } - - if (startswith(s, "GFORTRAN module")) { - return parse_gfortran_mod_file(al, s); - } else { - throw LFortranException("Unknown module file format"); - } -} - -} // namespace LFortran diff --git a/src/lpython/mod_to_asr.h b/src/lpython/mod_to_asr.h deleted file mode 100644 index a1d0ea6076..0000000000 --- a/src/lpython/mod_to_asr.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef LFORTRAN_MOD_TO_ASR_H -#define LFORTRAN_MOD_TO_ASR_H - -#include - -namespace LFortran { - - ASR::TranslationUnit_t *mod_to_asr(Allocator &al, std::string filename); - -} // namespace LFortran - -#endif // LFORTRAN_MOD_TO_ASR_H diff --git a/src/lpython/pickle.cpp b/src/lpython/pickle.cpp index a2b5a6e23e..fc5026f08e 100644 --- a/src/lpython/pickle.cpp +++ b/src/lpython/pickle.cpp @@ -6,150 +6,8 @@ #include #include -using LFortran::AST::ast_t; -using LFortran::AST::Declaration_t; -using LFortran::AST::expr_t; -using LFortran::AST::stmt_t; -using LFortran::AST::Name_t; -using LFortran::AST::Num_t; -using LFortran::AST::BinOp_t; -using LFortran::AST::UnaryOp_t; -using LFortran::AST::Compare_t; -using LFortran::AST::If_t; -using LFortran::AST::Assignment_t; -using LFortran::AST::WhileLoop_t; -using LFortran::AST::Exit_t; -using LFortran::AST::Return_t; -using LFortran::AST::Cycle_t; -using LFortran::AST::DoLoop_t; -using LFortran::AST::Subroutine_t; -using LFortran::AST::Function_t; -using LFortran::AST::Program_t; -using LFortran::AST::astType; -using LFortran::AST::exprType; -using LFortran::AST::stmtType; -using LFortran::AST::operatorType; -using LFortran::AST::unaryopType; -using LFortran::AST::cmpopType; -using LFortran::AST::TranslationUnit_t; -using LFortran::AST::PickleBaseVisitor; - - namespace LFortran { -std::string op2str(const operatorType type) -{ - switch (type) { - case (operatorType::Add) : return "+"; - case (operatorType::Sub) : return "-"; - case (operatorType::Mul) : return "*"; - case (operatorType::Div) : return "/"; - case (operatorType::Pow) : return "**"; - } - throw std::runtime_error("Unknown type"); -} - -std::string unop2str(const unaryopType type) -{ - switch (type) { - case (unaryopType::Invert) : return "inv"; - case (unaryopType::Not) : return "not"; - case (unaryopType::UAdd) : return "u+"; - case (unaryopType::USub) : return "u-"; - } - throw std::runtime_error("Unknown type"); -} - -std::string compare2str(const cmpopType type) -{ - switch (type) { - case (cmpopType::Eq) : return "=="; - case (cmpopType::NotEq) : return "/="; - case (cmpopType::Lt) : return "<"; - case (cmpopType::LtE) : return "<="; - case (cmpopType::Gt) : return ">"; - case (cmpopType::GtE) : return ">="; - } - throw std::runtime_error("Unknown type"); -} - -class PickleVisitor : public PickleBaseVisitor -{ -public: - void visit_BinOp(const BinOp_t &x) { - s.append("("); - // We do not print BinOp +, but rather just +. It is still uniquely - // determined that + means BinOp's +. - /* - s.append(expr2str(x.base.type)); - s.append(" "); - */ - s.append(op2str(x.m_op)); - s.append(" "); - this->visit_expr(*x.m_left); - s.append(" "); - this->visit_expr(*x.m_right); - s.append(")"); - } - void visit_UnaryOp(const UnaryOp_t &x) { - s.append("("); - s.append(unop2str(x.m_op)); - s.append(" "); - this->visit_expr(*x.m_operand); - s.append(")"); - } - void visit_Compare(const Compare_t &x) { - s.append("("); - s.append(compare2str(x.m_op)); - s.append(" "); - this->visit_expr(*x.m_left); - s.append(" "); - this->visit_expr(*x.m_right); - s.append(")"); - } - void visit_Name(const Name_t &x) { - if (use_colors) { - s.append(color(fg::yellow)); - } - s.append(x.m_id); - if (use_colors) { - s.append(color(fg::reset)); - } - } - void visit_Num(const Num_t &x) { - if (use_colors) { - s.append(color(fg::cyan)); - } - s.append(BigInt::int_to_str(x.m_n)); - if (use_colors) { - s.append(color(fg::reset)); - } - if (x.m_kind) { - s += "_"; - s += x.m_kind; - } - } - std::string get_str() { - return s; - } -}; - -std::string pickle(LFortran::AST::ast_t &ast, bool colors, bool indent) { - PickleVisitor v; - v.use_colors = colors; - v.indent = indent; - v.visit_ast(ast); - return v.get_str(); -} - -std::string pickle(AST::TranslationUnit_t &ast, bool colors,bool indent) { - PickleVisitor v; - v.use_colors = colors; - v.indent = indent; - v.visit_ast((AST::ast_t&)(ast)); - return v.get_str(); -} - /* -----------------------------------------------------------------------*/ // ASR diff --git a/src/lpython/pickle.h b/src/lpython/pickle.h index 1076b3a1c6..83537609aa 100644 --- a/src/lpython/pickle.h +++ b/src/lpython/pickle.h @@ -1,15 +1,10 @@ #ifndef LFORTRAN_PICKLE_H #define LFORTRAN_PICKLE_H -#include #include namespace LFortran { - // Pickle an AST node - std::string pickle(AST::ast_t &ast, bool colors=false, bool indent=false); - std::string pickle(AST::TranslationUnit_t &ast, bool colors=false, bool indent=false); - // Pickle an ASR node std::string pickle(ASR::asr_t &asr, bool colors=false, bool indent=false, bool show_intrinsic_modules=false); diff --git a/src/lpython/semantics/python_comptime_eval.h b/src/lpython/semantics/python_comptime_eval.h index 2a1314423b..be5595f0e7 100644 --- a/src/lpython/semantics/python_comptime_eval.h +++ b/src/lpython/semantics/python_comptime_eval.h @@ -10,7 +10,6 @@ #include #include -#include #include #include #include diff --git a/src/lpython/tests/CMakeLists.txt b/src/lpython/tests/CMakeLists.txt index 1c55c5429d..88209b87e9 100644 --- a/src/lpython/tests/CMakeLists.txt +++ b/src/lpython/tests/CMakeLists.txt @@ -16,7 +16,6 @@ ADDTEST(test_stacktrace) set(SRC test_parse.cpp - test_ast.cpp test_stacktrace2.cpp test_asm.cpp test_serialization.cpp diff --git a/src/lpython/tests/test_ast.cpp b/src/lpython/tests/test_ast.cpp deleted file mode 100644 index 36dc3cfe25..0000000000 --- a/src/lpython/tests/test_ast.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -#include - -#include -#include -#include -#include - -namespace LFortran { - - -TEST_CASE("Test types") { - Allocator al(1024*1024); - Location loc; - - AST::ast_t &a = *AST::make_Num_t(al, loc, 5, nullptr); - CHECK(AST::is_a(a)); - CHECK(! AST::is_a(a)); - - AST::Num_t &x = *AST::down_cast2(&a); - CHECK(x.m_n == 5); - -} - - -} // namespace LFortran diff --git a/src/lpython/tests/test_llvm.cpp b/src/lpython/tests/test_llvm.cpp index b687fcf9ea..33bb4d092f 100644 --- a/src/lpython/tests/test_llvm.cpp +++ b/src/lpython/tests/test_llvm.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/lpython/tests/test_parse.cpp b/src/lpython/tests/test_parse.cpp index 105b0a5764..ddbebac1a8 100644 --- a/src/lpython/tests/test_parse.cpp +++ b/src/lpython/tests/test_parse.cpp @@ -6,14 +6,9 @@ #include #include -#include using LFortran::TRY; using LFortran::Result; -using LFortran::AST::ast_t; -using LFortran::AST::expr_t; -using LFortran::AST::Name_t; -using LFortran::AST::BaseWalkVisitor; using LFortran::BigInt::is_int_ptr; using LFortran::BigInt::ptr_to_int; @@ -50,23 +45,6 @@ namespace doctest { } -class CountVisitor : public BaseWalkVisitor -{ - int c_; -public: - CountVisitor() : c_{0} {} - void visit_Name(const Name_t & /* x */) { c_ += 1; } - int get_count() { - return c_; - } -}; - -int count(const ast_t &b) { - CountVisitor v; - v.visit_ast(b); - return v.get_count(); -} - class TokenizerError0 { }; diff --git a/src/lpython/tests/test_serialization.cpp b/src/lpython/tests/test_serialization.cpp index 799215b241..4c4a3f08fd 100644 --- a/src/lpython/tests/test_serialization.cpp +++ b/src/lpython/tests/test_serialization.cpp @@ -3,8 +3,6 @@ #include #include -#include -#include #include #include #include diff --git a/src/lpython/tests/test_stacktrace2.cpp b/src/lpython/tests/test_stacktrace2.cpp index f84effd49c..c6280546d2 100644 --- a/src/lpython/tests/test_stacktrace2.cpp +++ b/src/lpython/tests/test_stacktrace2.cpp @@ -3,7 +3,6 @@ #include #include -#include TEST_CASE("Address to line number"){