summaryrefslogtreecommitdiff
path: root/projects/hackc/statements.py
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2022-08-31 16:42:22 +0800
committerFrederick Yin <fkfd@fkfd.me>2022-08-31 16:42:22 +0800
commit61f3490b9e6132cbad70c90637ed349a42fe7704 (patch)
treee9784e13a9d127e59ea00b234ff9af47a65d7505 /projects/hackc/statements.py
parent75811ebbd166b3cd271bb730323cc7ab4fdcb3a5 (diff)
hackc: i dont even remember
Diffstat (limited to 'projects/hackc/statements.py')
-rw-r--r--projects/hackc/statements.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/projects/hackc/statements.py b/projects/hackc/statements.py
new file mode 100644
index 0000000..e8bc0b3
--- /dev/null
+++ b/projects/hackc/statements.py
@@ -0,0 +1,49 @@
+from .expressions import Expression
+
+class Statement:
+ def __init__(self):
+ pass
+
+ @classmethod
+ def from_tokens(cls, tokens: list) -> tuple:
+ for StatementClass in [LetStatement]:
+ stmt, dt = StatementClass.from_tokens(tokens)
+ if stmt is not None:
+ return (stmt, dt)
+
+ return (None, 0)
+
+class LetStatement:
+ def __init__(self, name, expr):
+ self.name = name
+ self.expr = expr
+
+ @classmethod
+ def from_tokens(cls, tokens: list) -> tuple:
+ """Construct let statement.
+
+ Format:
+ 'let' <name> '=' <expression> ';'
+ """
+ if len(tokens) < 5 or tokens[0] != "let":
+ return (None, 0)
+
+ name = tokens[1]
+ if name.type != "identifier":
+ raise JackSyntaxError(f"Expected variable name, got `{name}` instead", name)
+
+ if tokens[2] != "=":
+ raise JackSyntaxError(f"Expected `=`, got `{tokens[2]}` instead", tokens[2])
+
+ t = 3
+ expr, dt = Expression.from_tokens(tokens[t:])
+ if expr is None:
+ raise JackSyntaxError(f"Expected expression", tokens[3])
+ t += dt
+
+ if tokens[t] != ";":
+ raise JackSyntaxError(f"Expected `;`, got `{tokens[t]}` instead", tokens[t])
+
+ t += 1
+ return (LetStatement(name, expr), t)
+