diff --git a/ast_types.py b/ast_types.py new file mode 100644 index 0000000..1f07370 --- /dev/null +++ b/ast_types.py @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MIT +# Copyright 2021 Jookia + +class Reference: + def __init__(self, value): + self.value = value + + def __repr__(self): + return "Reference('%s')" % (self.value) + +class Text: + def __init__(self, value): + self.value = value + + def __repr__(self): + return "Text('%s')" % (self.value) + +class Statement: + def __init__(self, subject, verb, arguments): + self.subject = subject + self.verb = verb + self.arguments = arguments + + def __repr__(self): + return "Statement(subject %s, verb '%s', arguments %s)" % (self.subject, self.verb, self.arguments) + +class Set: + def __init__(self, subject, statement): + self.subject = subject + self.statement = statement + + def __repr__(self): + return "Set(subject %s, statement %s)" % (self.subject, self.statement) + +class Conditional: + def __init__(self, test, success, failure): + self.test = test + self.success = success + self.failure = failure + + def __repr__(self): + return "Conditional(test %s, success %s, failure %s)" % (self.test, self.success, self.failure) diff --git a/interp.py b/interp.py index 38f447e..d4bb1d4 100644 --- a/interp.py +++ b/interp.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT # Copyright 2021 Jookia -import parse +import ast_types def text_create(value): return ("text", value) @@ -31,9 +31,9 @@ }) def resolve_value(env, value): - if value.__class__ == parse.Reference: + if value.__class__ == ast_types.Reference: return env[value.value] - elif value.__class__ == parse.Text: + elif value.__class__ == ast_types.Text: return text_create(value.value) else: print("Unimplemented value: %s" % (value)) @@ -60,11 +60,11 @@ return None def run_command(env, ast): - if ast.__class__ == parse.Statement: + if ast.__class__ == ast_types.Statement: return run_statement(env, ast) - elif ast.__class__ == parse.Set: + elif ast.__class__ == ast_types.Set: return run_set(env, ast) - elif ast.__class__ == parse.Conditional: + elif ast.__class__ == ast_types.Conditional: return run_if(env, ast) else: print("Unknown command %s" % (ast)) diff --git a/parse.py b/parse.py index 111508a..54a7def 100644 --- a/parse.py +++ b/parse.py @@ -2,6 +2,7 @@ # Copyright 2021 Jookia import log +import ast_types class ParseContext: def __init__(self, parent, context, line, column): @@ -132,46 +133,6 @@ log.log(log.LEXER, log.DEBUG, "Tokens are %s" % (tokens)) return tokens -class Reference: - def __init__(self, value): - self.value = value - - def __repr__(self): - return "Reference('%s')" % (self.value) - -class Text: - def __init__(self, value): - self.value = value - - def __repr__(self): - return "Text('%s')" % (self.value) - -class Statement: - def __init__(self, subject, verb, arguments): - self.subject = subject - self.verb = verb - self.arguments = arguments - - def __repr__(self): - return "Statement(subject %s, verb '%s', arguments %s)" % (self.subject, self.verb, self.arguments) - -class Set: - def __init__(self, subject, statement): - self.subject = subject - self.statement = statement - - def __repr__(self): - return "Set(subject %s, statement %s)" % (self.subject, self.statement) - -class Conditional: - def __init__(self, test, success, failure): - self.test = test - self.success = success - self.failure = failure - - def __repr__(self): - return "Conditional(test %s, success %s, failure %s)" % (self.test, self.success, self.failure) - class Parser: def __init__(self, tokens): self.tokens = tokens @@ -212,9 +173,9 @@ def parse_value(self, context, subject, type, value): log.log(log.PARSER, log.TRACE, "Parsing value...") if type == "symbol": - ret = Reference(value) + ret = ast_types.Reference(value) elif type == "text": - ret = Text(value) + ret = ast_types.Text(value) else: raise ParseError(context, "Unexpected value type %s" % (type)) log.log(log.PARSER, log.TRACE, "Parsed value, AST is %s" % (ret)) @@ -265,7 +226,7 @@ arguments = self.parse_arguments(meta_context, terminator) else: arguments = [] - statement = Statement(subject, verb, arguments) + statement = ast_types.Statement(subject, verb, arguments) log.log(log.PARSER, log.DEBUG, "Parsed statement, AST is %s" % (statement)) return statement @@ -289,7 +250,7 @@ raise ParseError(context, "Expected To, got %s" % (pretty_value)) log.log(log.PARSER, log.TRACE, "Parsing set value...") ast = self.parse_statement(meta_context, "EndSet", "set value") - set = Set(subject, ast) + set = ast_types.Set(subject, ast) log.log(log.PARSER, log.DEBUG, "Parsed set, AST is %s" % (set)) return set @@ -302,7 +263,7 @@ success = self.parse_statement(context, "Else", "success") log.log(log.PARSER, log.TRACE, "Parsing if failure statement...") failure = self.parse_statement(context, "EndIf", "failure") - conditional = Conditional(test, success, failure) + conditional = ast_types.Conditional(test, success, failure) log.log(log.PARSER, log.DEBUG, "Parsed if, AST is %s" % (conditional)) return conditional