From 61f3490b9e6132cbad70c90637ed349a42fe7704 Mon Sep 17 00:00:00 2001 From: Frederick Yin Date: Wed, 31 Aug 2022 16:42:22 +0800 Subject: hackc: i dont even remember --- projects/hackc/statements.py | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 projects/hackc/statements.py (limited to 'projects/hackc/statements.py') 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' '=' ';' + """ + 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) + -- cgit v1.2.3