Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MatchOr and guard statements #158

Open
wants to merge 36 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
77da54b
wrote a basic test that calls visit_Match
juliawgraham Dec 4, 2022
c213d0f
added extra space to publish branch
juliawgraham Dec 4, 2022
73425a6
implementation for MatchValue
Yuqi07 Dec 4, 2022
adb9a50
partial implementation for MatchAs, only implemented for the wildcard…
Yuqi07 Dec 4, 2022
f64490e
changed test names for matchas tests
Yuqi07 Dec 4, 2022
4aa1195
1. merged visit match_case to visit Match; 2. added wildcards error h…
Yuqi07 Dec 7, 2022
607c359
1. removed unused i; 2. added error handling for multiple statements …
Yuqi07 Dec 7, 2022
33f7439
created a function visit_MatchOr, still needs to be implemented
erica-w-fu Dec 7, 2022
a57b6a8
updated matchcase to accept inequalities
juliawgraham Dec 9, 2022
e1d90f9
added support for and/or in guard
juliawgraham Dec 9, 2022
64a281c
matchor implemented with tests
Lucybean-hi Dec 9, 2022
4ab48e8
Merge branch 'integration' into matchand
erica-w-fu Dec 9, 2022
2dbcf03
added requirements for python version 3.10 for all test cases with match
erica-w-fu Dec 9, 2022
62a4633
updated formatting using flake/black
juliawgraham Dec 9, 2022
fc0372a
Merge branch 'integration' into matchand
erica-w-fu Dec 9, 2022
ad11197
Merge pull request #2 from erica-w-fu/matchand
erica-w-fu Dec 9, 2022
5b6e676
updated syntax according to flake/black (after merging match_case gua…
juliawgraham Dec 9, 2022
0a55289
Merge pull request #1 from google/main
juliawgraham Dec 11, 2022
f300ee7
Merge branch 'integration' into updatedMain
juliawgraham Dec 11, 2022
c047696
Moved matchor / match guard test cases into function_codegen_match_test
juliawgraham Dec 11, 2022
3b78dd7
Merge pull request #3 from erica-w-fu/updatedMain
juliawgraham Dec 11, 2022
fc4eca9
updated everything so it's consistent with main
Yuqi07 Dec 11, 2022
1a1cefe
resolved all comments on our latest PR
Yuqi07 Dec 11, 2022
befd6dc
fixed all CI errors, now all tests passed
Yuqi07 Dec 11, 2022
efd60f8
Update src/latexify/codegen/function_codegen.py
Lucybean-hi Dec 11, 2022
7b67262
Update src/latexify/codegen/function_codegen.py
Lucybean-hi Dec 11, 2022
33327a3
Update src/latexify/codegen/function_codegen.py
Lucybean-hi Dec 11, 2022
587c50b
Update src/latexify/codegen/function_codegen.py
Lucybean-hi Dec 11, 2022
ee82180
addressed all comments
Yuqi07 Dec 11, 2022
4db2356
fixed flake errors
Yuqi07 Dec 11, 2022
ccb0c5d
Added spaces to conditionals in tests
juliawgraham Dec 11, 2022
2d5807e
Added more spaces to conditionals in tests
juliawgraham Dec 11, 2022
fd2ddee
fixed style errors and removed guard
Yuqi07 Dec 15, 2022
0daeb72
used _match_subject_stack as suggested
Yuqi07 Dec 15, 2022
3cf0b0e
Merge branch 'main' into integration
Yuqi07 Dec 15, 2022
2019d4b
fixed unit tests, adding cdot back
Yuqi07 Dec 15, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
resolved all comments on our latest PR
Yuqi07 committed Dec 11, 2022

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 1a1cefe0cb125bdf9adea546b1c8c7f146b36531
111 changes: 14 additions & 97 deletions src/latexify/codegen/function_codegen.py
Original file line number Diff line number Diff line change
@@ -139,53 +139,8 @@ def visit_If(self, node: ast.If) -> str:
latex += self.visit(current_stmt)
return latex + r", & \mathrm{otherwise} \end{array} \right."

#########

# def visit_Match(self, node: ast.Match) -> str:
# """Visit a Match node"""
# if not (
# len(node.cases) >= 2
# and isinstance(node.cases[-1].pattern, ast.MatchAs)
# and node.cases[-1].pattern.name is None
# ):
# raise exceptions.LatexifySyntaxError(
# "Match statement must contain the wildcard."
# )

# subject_latex = self._expression_codegen.visit(node.subject)
# case_latexes: list[str] = []

# for i, case in enumerate(node.cases):
# if len(case.body) != 1 or not isinstance(case.body[0], ast.Return):
# raise exceptions.LatexifyNotSupportedError(
# "Match cases must contain exactly 1 return statement."
# )

# if i < len(node.cases) - 1:
# body_latex = self.visit(case.body[0])
# cond_latex = self.visit(case.pattern)
# case_latexes.append(
# body_latex + r", & \mathrm{if} \ " + subject_latex + cond_latex
# )
# else:
# case_latexes.append(
# self.visit(node.cases[-1].body[0]) + r", & \mathrm{otherwise}"
# )

# return (
# r"\left\{ \begin{array}{ll} "
# + r" \\ ".join(case_latexes)
# + r" \end{array} \right."
# )

# def visit_MatchValue(self, node: ast.MatchValue) -> str:
# """Visit a MatchValue node"""
# latex = self._expression_codegen.visit(node.value)
# return " = " + latex

############
def visit_Match(self, node: ast.Match) -> str:
"""Visit a Match node"""
"""Visit a Match node."""
if not (
len(node.cases) >= 2
and isinstance(node.cases[-1].pattern, ast.MatchAs)
@@ -208,7 +163,7 @@ def visit_Match(self, node: ast.Match) -> str:
if i < len(node.cases) - 1:
body_latex = self.visit(case.body[0])
cond_latex = self.visit(case.pattern)
if case.guard:
if case.guard is not None:
cond_latex = self._expression_codegen.visit(case.guard)
subject_latex = "" # getting variable from cond_latex

@@ -228,14 +183,16 @@ def visit_Match(self, node: ast.Match) -> str:
return latex_final

def visit_MatchValue(self, node: ast.MatchValue) -> str:
"""Visit a MatchValue node"""
"""Visit a MatchValue node."""
latex = self._expression_codegen.visit(node.value)

return "subject_name = " + latex

def visit_MatchAs(self, node: ast.MatchAs) -> str:
"""Visit a MatchAs node"""
"""If MatchAs is a wildcard, return 'otherwise' case, else throw error"""
"""
Visit a MatchAs node.
If MatchAs is a wildcard, return 'otherwise' case, else throw error
"""
if not (node.pattern):
return ""
else:
@@ -244,53 +201,13 @@ def visit_MatchAs(self, node: ast.MatchAs) -> str:
)

def visit_MatchOr(self, node: ast.MatchOr) -> str:
"""Visit a MatchOr node"""
latex = ""
"""Visit a MatchOr node."""
case_latexes: list[str] = []
for i, pattern in enumerate(node.patterns):
if i != 0:
latex += r" \lor " + self.visit(pattern)
else:
latex += self.visit(pattern)
return latex

def _reduce_stop_parameter(self, node: ast.BinOp) -> str:
# ast.Constant class is added in Python 3.8
# ast.Num is the relevant node type in previous versions
if sys.version_info.minor < 8:
if isinstance(node.right, ast.Num):
if isinstance(node.op, ast.Add):
if node.right.n == 1:
upper = "{" + self.visit(node.left) + "}"
else:
reduced_constant = ast.Num(node.right.n - 1)
new_node = ast.BinOp(node.left, node.op, reduced_constant)
upper = "{" + self.visit(new_node) + "}"
else:
if node.right.n == -1:
upper = "{" + self.visit(node.left) + "}"
else:
reduced_constant = ast.Num(node.right.n + 1)
new_node = ast.BinOp(node.left, node.op, reduced_constant)
upper = "{" + self.visit(new_node) + "}"
else:
upper = "{" + self.visit(node) + "}"
else:
if isinstance(node.right, ast.Constant):
if isinstance(node.op, ast.Add):
if node.right.value == 1:
upper = "{" + self.visit(node.left) + "}"
else:
reduced_constant = ast.Constant(node.right.value - 1)
new_node = ast.BinOp(node.left, node.op, reduced_constant)
upper = "{" + self.visit(new_node) + "}"
else:
if node.right.value == -1:
upper = "{" + self.visit(node.left) + "}"
else:
reduced_constant = ast.Constant(node.right.value + 1)
new_node = ast.BinOp(node.left, node.op, reduced_constant)
upper = "{" + self.visit(new_node) + "}"
case_latexes.append(
r" \lor " + self.visit(pattern)
)
else:
upper = "{" + self.visit(node) + "}"

return upper
case_latexes.append(self.visit(pattern))
return "".join(case_latexes)
26 changes: 13 additions & 13 deletions src/latexify/codegen/function_codegen_match_test.py
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@


@test_utils.require_at_least(10)
def test_functiondef_match() -> None:
def test_visit_functiondef_match() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -36,7 +36,7 @@ def f(x):


@test_utils.require_at_least(10)
def test_matchvalue() -> None:
def test_visit_match() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -58,7 +58,7 @@ def test_matchvalue() -> None:


@test_utils.require_at_least(10)
def test_multiple_matchvalue() -> None:
def test_visit_multiple_match_cases() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -83,7 +83,7 @@ def test_multiple_matchvalue() -> None:


@test_utils.require_at_least(10)
def test_single_matchvalue_no_wildcards() -> None:
def test_visit_single_match_case_no_wildcards() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -102,7 +102,7 @@ def test_single_matchvalue_no_wildcards() -> None:


@test_utils.require_at_least(10)
def test_multiple_matchvalue_no_wildcards() -> None:
def test_visit_multiple_match_cases_no_wildcards() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -123,7 +123,7 @@ def test_multiple_matchvalue_no_wildcards() -> None:


@test_utils.require_at_least(10)
def test_matchas_nonempty() -> None:
def test_visit_only_wildcard_in_matchas() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -144,7 +144,7 @@ def test_matchas_nonempty() -> None:


@test_utils.require_at_least(10)
def test_matchvalue_no_return() -> None:
def test_visit_match_case_no_return() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -165,7 +165,7 @@ def test_matchvalue_no_return() -> None:


@test_utils.require_at_least(10)
def test_matchvalue_mutliple_statements() -> None:
def test_visit_match_case_mutliple_statements() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -187,7 +187,7 @@ def test_matchvalue_mutliple_statements() -> None:


@test_utils.require_at_least(10)
def test_matchcase_with_guard() -> None:
def test_visit_match_case_with_if() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -209,7 +209,7 @@ def test_matchcase_with_guard() -> None:


@test_utils.require_at_least(10)
def test_matchcase_with_and_guard() -> None:
def test_visit_match_case_with_if_and() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -231,7 +231,7 @@ def test_matchcase_with_and_guard() -> None:


@test_utils.require_at_least(10)
def test_matchcase_with_or_guard() -> None:
def test_visit_matchcase_with_if_or() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -253,7 +253,7 @@ def test_matchcase_with_or_guard() -> None:


@test_utils.require_at_least(10)
def test_matchcase_with_multiple_guards() -> None:
def test_visit_match_case_with_combined_condition() -> None:
tree = ast.parse(
textwrap.dedent(
"""
@@ -275,7 +275,7 @@ def test_matchcase_with_multiple_guards() -> None:


@test_utils.require_at_least(10)
def test_matchor() -> None:
def test_visit_match_case_or() -> None:
tree = ast.parse(
textwrap.dedent(
"""