From 80216ac17dc2fcb666402a6f6936817ee5f65732 Mon Sep 17 00:00:00 2001 From: Khushi Agrawal Date: Thu, 7 Mar 2024 13:16:05 +0530 Subject: [PATCH 1/3] [asr->python] add complex visitors --- src/libasr/codegen/asr_to_python.cpp | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/libasr/codegen/asr_to_python.cpp b/src/libasr/codegen/asr_to_python.cpp index 69f7a0bf4d..ff75a3ff11 100644 --- a/src/libasr/codegen/asr_to_python.cpp +++ b/src/libasr/codegen/asr_to_python.cpp @@ -610,6 +610,36 @@ class ASRToLpythonVisitor : public ASR::BaseVisitor s = r; } + void visit_ComplexConstructor(const ASR::ComplexConstructor_t &x) { + visit_expr(*x.m_re); + std::string re = s; + visit_expr(*x.m_im); + std::string im = s; + s = "(" + re + ", " + im + ")"; + } + + void visit_ComplexBinOp(const ASR::ComplexBinOp_t &x) { + std::string r; + int current_precedence = last_expr_precedence; + visit_expr_with_precedence(*x.m_left, current_precedence); + r += s; + r += binop2str(x.m_op); + visit_expr_with_precedence(*x.m_right, current_precedence); + r += s; + last_expr_precedence = current_precedence; + s = r; + } + + void visit_ComplexRe(const ASR::ComplexRe_t &x) { + visit_expr(*x.m_arg); + s = "real(" + s + ")"; + } + + void visit_ComplexIm(const ASR::ComplexIm_t &x) { + visit_expr(*x.m_arg); + s = "img(" + s + ")"; + } + void visit_Assert(const ASR::Assert_t &x) { std::string r = indent; r += "assert "; From 5fc112b7f2c60ac24f4e7e174768785f83d7bfd4 Mon Sep 17 00:00:00 2001 From: Khushi Agrawal Date: Thu, 7 Mar 2024 15:58:51 +0530 Subject: [PATCH 2/3] visit_complex --- src/libasr/codegen/asr_to_python.cpp | 42 ++++++++++++++++++-- tests/reference/python-expr14-2e6ab03.json | 13 ++++++ tests/reference/python-expr14-2e6ab03.stdout | 14 +++++++ tests/tests.toml | 1 + 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 tests/reference/python-expr14-2e6ab03.json create mode 100644 tests/reference/python-expr14-2e6ab03.stdout diff --git a/src/libasr/codegen/asr_to_python.cpp b/src/libasr/codegen/asr_to_python.cpp index ff75a3ff11..74411ec7dc 100644 --- a/src/libasr/codegen/asr_to_python.cpp +++ b/src/libasr/codegen/asr_to_python.cpp @@ -573,6 +573,42 @@ class ASRToLpythonVisitor : public ASR::BaseVisitor s += "len(" + s + ")"; } + void visit_StringItem(const ASR::StringItem_t &x) { + std::string r = ""; + visit_expr(*x.m_arg); + r += s; + r += "["; + visit_expr(*x.m_idx); + r += s; + r += "]"; + s = r; + } + + void visit_StringSection(const ASR::StringSection_t &x) { + std::string r = ""; + visit_expr(*x.m_arg); + r += s; + if (x.m_start) { + r += "["; + visit_expr(*x.m_start); + r += s; + } + if (x.m_end) { + r += ":"; + visit_expr(*x.m_end); + r += s; + } + if (x.m_step) { + r += ":"; + visit_expr(*x.m_step); + r += s; + r += "]"; + } else { + r += "]"; + } + s = r; + } + void visit_IfExp(const ASR::IfExp_t &x) { std::string r; visit_expr(*x.m_body); @@ -615,7 +651,7 @@ class ASRToLpythonVisitor : public ASR::BaseVisitor std::string re = s; visit_expr(*x.m_im); std::string im = s; - s = "(" + re + ", " + im + ")"; + s = "complex(" + re + ", " + im + ")"; } void visit_ComplexBinOp(const ASR::ComplexBinOp_t &x) { @@ -632,12 +668,12 @@ class ASRToLpythonVisitor : public ASR::BaseVisitor void visit_ComplexRe(const ASR::ComplexRe_t &x) { visit_expr(*x.m_arg); - s = "real(" + s + ")"; + s = s + ".real"; } void visit_ComplexIm(const ASR::ComplexIm_t &x) { visit_expr(*x.m_arg); - s = "img(" + s + ")"; + s = s + ".imag"; } void visit_Assert(const ASR::Assert_t &x) { diff --git a/tests/reference/python-expr14-2e6ab03.json b/tests/reference/python-expr14-2e6ab03.json new file mode 100644 index 0000000000..07804d8bb7 --- /dev/null +++ b/tests/reference/python-expr14-2e6ab03.json @@ -0,0 +1,13 @@ +{ + "basename": "python-expr14-2e6ab03", + "cmd": "lpython --no-color --show-python {infile}", + "infile": "tests/expr14.py", + "infile_hash": "d18abc152939c944f6a1e493754cea8b72f0d03d360ab4c9e75ad697", + "outfile": null, + "outfile_hash": null, + "stdout": "python-expr14-2e6ab03.stdout", + "stdout_hash": "4e737bfedf3287210bb61d94eee0b440713c63f1c4a84e262d815332", + "stderr": null, + "stderr_hash": null, + "returncode": 0 +} \ No newline at end of file diff --git a/tests/reference/python-expr14-2e6ab03.stdout b/tests/reference/python-expr14-2e6ab03.stdout new file mode 100644 index 0000000000..33a8ae926f --- /dev/null +++ b/tests/reference/python-expr14-2e6ab03.stdout @@ -0,0 +1,14 @@ +def test_boolean_comparison(): + b1: bool + b2: bool + b3: bool + b1 = True + b2 = True + b3 = False + b1 = (b1) > (b2) + b1 = (b1) == (b2) + b1 = (b2) != (b3) + b1 = (b2) >= (b3) + b1 = (b2) <= (b3) + + diff --git a/tests/tests.toml b/tests/tests.toml index 9be71acb27..3eae0f1377 100644 --- a/tests/tests.toml +++ b/tests/tests.toml @@ -131,6 +131,7 @@ asr = true filename = "expr14.py" llvm = true wat = true +python = true [[test]] filename = "expr15.py" From 626fa9570a790cbad46323d4bb904006cd8432eb Mon Sep 17 00:00:00 2001 From: Khushi Agrawal Date: Fri, 8 Mar 2024 23:18:44 +0530 Subject: [PATCH 3/3] remove string visitors and tests (shifted to other PR) --- src/libasr/codegen/asr_to_python.cpp | 36 -------------------- tests/reference/python-expr14-2e6ab03.json | 13 ------- tests/reference/python-expr14-2e6ab03.stdout | 14 -------- tests/tests.toml | 1 - 4 files changed, 64 deletions(-) delete mode 100644 tests/reference/python-expr14-2e6ab03.json delete mode 100644 tests/reference/python-expr14-2e6ab03.stdout diff --git a/src/libasr/codegen/asr_to_python.cpp b/src/libasr/codegen/asr_to_python.cpp index 74411ec7dc..22fe0ccd2d 100644 --- a/src/libasr/codegen/asr_to_python.cpp +++ b/src/libasr/codegen/asr_to_python.cpp @@ -573,42 +573,6 @@ class ASRToLpythonVisitor : public ASR::BaseVisitor s += "len(" + s + ")"; } - void visit_StringItem(const ASR::StringItem_t &x) { - std::string r = ""; - visit_expr(*x.m_arg); - r += s; - r += "["; - visit_expr(*x.m_idx); - r += s; - r += "]"; - s = r; - } - - void visit_StringSection(const ASR::StringSection_t &x) { - std::string r = ""; - visit_expr(*x.m_arg); - r += s; - if (x.m_start) { - r += "["; - visit_expr(*x.m_start); - r += s; - } - if (x.m_end) { - r += ":"; - visit_expr(*x.m_end); - r += s; - } - if (x.m_step) { - r += ":"; - visit_expr(*x.m_step); - r += s; - r += "]"; - } else { - r += "]"; - } - s = r; - } - void visit_IfExp(const ASR::IfExp_t &x) { std::string r; visit_expr(*x.m_body); diff --git a/tests/reference/python-expr14-2e6ab03.json b/tests/reference/python-expr14-2e6ab03.json deleted file mode 100644 index 07804d8bb7..0000000000 --- a/tests/reference/python-expr14-2e6ab03.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "basename": "python-expr14-2e6ab03", - "cmd": "lpython --no-color --show-python {infile}", - "infile": "tests/expr14.py", - "infile_hash": "d18abc152939c944f6a1e493754cea8b72f0d03d360ab4c9e75ad697", - "outfile": null, - "outfile_hash": null, - "stdout": "python-expr14-2e6ab03.stdout", - "stdout_hash": "4e737bfedf3287210bb61d94eee0b440713c63f1c4a84e262d815332", - "stderr": null, - "stderr_hash": null, - "returncode": 0 -} \ No newline at end of file diff --git a/tests/reference/python-expr14-2e6ab03.stdout b/tests/reference/python-expr14-2e6ab03.stdout deleted file mode 100644 index 33a8ae926f..0000000000 --- a/tests/reference/python-expr14-2e6ab03.stdout +++ /dev/null @@ -1,14 +0,0 @@ -def test_boolean_comparison(): - b1: bool - b2: bool - b3: bool - b1 = True - b2 = True - b3 = False - b1 = (b1) > (b2) - b1 = (b1) == (b2) - b1 = (b2) != (b3) - b1 = (b2) >= (b3) - b1 = (b2) <= (b3) - - diff --git a/tests/tests.toml b/tests/tests.toml index 3eae0f1377..9be71acb27 100644 --- a/tests/tests.toml +++ b/tests/tests.toml @@ -131,7 +131,6 @@ asr = true filename = "expr14.py" llvm = true wat = true -python = true [[test]] filename = "expr15.py"