From 7b4f4fa8fb1599f56286d83432a94ceeb9ce0706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sat, 6 Jul 2019 12:10:58 +0200 Subject: [PATCH] Add 'import' statements --- smnp/newast/node/imports.py | 76 +++++++++++++++++++++++++++++++ smnp/newast/node/program.py | 3 ++ smnp/token/tokenizer.py | 9 ++-- smnp/token/tokenizers/extend.py | 6 --- smnp/token/tokenizers/function.py | 5 -- smnp/token/tokenizers/keyword.py | 34 ++++++++++++++ smnp/token/tokenizers/ret.py | 5 -- smnp/token/tokenizers/type.py | 8 ---- smnp/token/type.py | 3 ++ 9 files changed, 121 insertions(+), 28 deletions(-) create mode 100644 smnp/newast/node/imports.py delete mode 100644 smnp/token/tokenizers/extend.py delete mode 100644 smnp/token/tokenizers/function.py create mode 100644 smnp/token/tokenizers/keyword.py delete mode 100644 smnp/token/tokenizers/ret.py delete mode 100644 smnp/token/tokenizers/type.py diff --git a/smnp/newast/node/imports.py b/smnp/newast/node/imports.py new file mode 100644 index 0000000..5a075b1 --- /dev/null +++ b/smnp/newast/node/imports.py @@ -0,0 +1,76 @@ +from smnp.newast.node.identifier import IdentifierNode +from smnp.newast.node.model import Node +from smnp.newast.node.none import NoneNode +from smnp.newast.node.string import StringLiteralNode +from smnp.newast.node.type import TypeNode +from smnp.newast.parser import Parser +from smnp.token.type import TokenType + + +class ImportNode(Node): + def __init__(self, pos): + super().__init__(pos) + self.children = [NoneNode(), NoneNode(), NoneNode()] + + @property + def source(self): + return self[0] + + @source.setter + def source(self, value): + self[0] = value + + @property + def type(self): + return self[1] + + @type.setter + def type(self, value): + self[1] = value + + @property + def variable(self): + return self[2] + + @variable.setter + def variable(self, value): + self[2] = value + + @classmethod + def _parse(cls, input): + return Parser.oneOf( + cls._literalImportParser(), + cls._fileImportParser() + )(input) + + @classmethod + def _literalImportParser(cls): + def createNode(importKeyword, type, fromKeyword, source, asKeyword, variable): + node = ImportNode(importKeyword.pos) + node.source = source + node.type = type + node.variable = variable + return node + + return Parser.allOf( + Parser.terminalParser(TokenType.IMPORT), + TypeNode.parse, + Parser.terminalParser(TokenType.FROM), + StringLiteralNode._literalParser(), + Parser.terminalParser(TokenType.AS), + IdentifierNode.identifierParser(), + createNode=createNode + ) + + @classmethod + def _fileImportParser(cls): + def createNode(importKeyword, source): + node = ImportNode(importKeyword.pos) + node.source = source + return node + + return Parser.allOf( + Parser.terminalParser(TokenType.IMPORT), + StringLiteralNode._literalParser(), + createNode=createNode + ) diff --git a/smnp/newast/node/program.py b/smnp/newast/node/program.py index 75c4a3c..7acfaad 100644 --- a/smnp/newast/node/program.py +++ b/smnp/newast/node/program.py @@ -2,8 +2,10 @@ from smnp.error.syntax import SyntaxException from smnp.newast.node.expression import ExpressionNode from smnp.newast.node.extend import ExtendNode from smnp.newast.node.function import FunctionDefinitionNode +from smnp.newast.node.imports import ImportNode from smnp.newast.node.model import Node, ParseResult from smnp.newast.node.statement import StatementNode + from smnp.newast.parser import Parser @@ -18,6 +20,7 @@ class Program(Node): FunctionDefinitionNode.parse, ExtendNode.parse, ExpressionNode.parse, + ImportNode.parse, StatementNode.parse, exception = SyntaxException(f"Unknown statement: {input.current().pos}") )(input) diff --git a/smnp/token/tokenizer.py b/smnp/token/tokenizer.py index 23d264a..d884784 100644 --- a/smnp/token/tokenizer.py +++ b/smnp/token/tokenizer.py @@ -6,18 +6,16 @@ from smnp.token.tokenizers.bracket import tokenizeOpenBracket, tokenizeCloseBrac from smnp.token.tokenizers.comma import tokenizeComma from smnp.token.tokenizers.comment import tokenizeComment from smnp.token.tokenizers.dot import tokenizeDot -from smnp.token.tokenizers.extend import tokenizeExtend -from smnp.token.tokenizers.function import tokenizeFunction from smnp.token.tokenizers.identifier import tokenizeIdentifier from smnp.token.tokenizers.integer import tokenizeInteger +from smnp.token.tokenizers.keyword import tokenizeType, tokenizeFunction, tokenizeReturn, tokenizeExtend, \ + tokenizeImport, tokenizeFrom, tokenizeAs from smnp.token.tokenizers.minus import tokenizeMinus from smnp.token.tokenizers.note import tokenizeNote from smnp.token.tokenizers.paren import tokenizeOpenParen, tokenizeCloseParen from smnp.token.tokenizers.percent import tokenizePercent -from smnp.token.tokenizers.ret import tokenizeReturn from smnp.token.tokenizers.square import tokenizeOpenSquare, tokenizeCloseSquare from smnp.token.tokenizers.string import tokenizeString -from smnp.token.tokenizers.type import tokenizeType from smnp.token.tokenizers.whitespace import tokenizeWhitespaces from smnp.token.type import TokenType @@ -32,6 +30,9 @@ tokenizers = ( tokenizeFunction, tokenizeReturn, tokenizeExtend, + tokenizeImport, + tokenizeFrom, + tokenizeAs, tokenizeInteger, tokenizeNote, tokenizeIdentifier, diff --git a/smnp/token/tokenizers/extend.py b/smnp/token/tokenizers/extend.py deleted file mode 100644 index 1ae25fc..0000000 --- a/smnp/token/tokenizers/extend.py +++ /dev/null @@ -1,6 +0,0 @@ -from smnp.token.tools import tokenizeKeyword -from smnp.token.type import TokenType - - -def tokenizeExtend(input, current, line): - return tokenizeKeyword(TokenType.EXTEND, "extend", input, current, line) \ No newline at end of file diff --git a/smnp/token/tokenizers/function.py b/smnp/token/tokenizers/function.py deleted file mode 100644 index 2d12bab..0000000 --- a/smnp/token/tokenizers/function.py +++ /dev/null @@ -1,5 +0,0 @@ -from smnp.token.tools import tokenizeKeyword -from smnp.token.type import TokenType - -def tokenizeFunction(input, current, line): - return tokenizeKeyword(TokenType.FUNCTION, 'function', input, current, line) diff --git a/smnp/token/tokenizers/keyword.py b/smnp/token/tokenizers/keyword.py new file mode 100644 index 0000000..e3feb76 --- /dev/null +++ b/smnp/token/tokenizers/keyword.py @@ -0,0 +1,34 @@ +from smnp.token.tools import tokenizeKeywords, tokenizeKeyword +from smnp.token.type import TokenType +from smnp.type.model import Type + + +def tokenizeType(input, current, line): + types = [ type.name.lower() for type in Type ] + return tokenizeKeywords(TokenType.TYPE, input, current, line, *types) + + +def tokenizeReturn(input, current, line): + return tokenizeKeyword(TokenType.RETURN, 'return', input, current, line) + + +def tokenizeFunction(input, current, line): + return tokenizeKeyword(TokenType.FUNCTION, 'function', input, current, line) + + +def tokenizeExtend(input, current, line): + return tokenizeKeyword(TokenType.EXTEND, "extend", input, current, line) + + +def tokenizeImport(input, current, line): + return tokenizeKeyword(TokenType.IMPORT, "import", input, current, line) + + +def tokenizeFrom(input, current, line): + return tokenizeKeyword(TokenType.FROM, "from", input, current, line) + + +def tokenizeAs(input, current, line): + return tokenizeKeyword(TokenType.AS, "as", input, current, line) + + diff --git a/smnp/token/tokenizers/ret.py b/smnp/token/tokenizers/ret.py deleted file mode 100644 index 2d9a387..0000000 --- a/smnp/token/tokenizers/ret.py +++ /dev/null @@ -1,5 +0,0 @@ -from smnp.token.tools import tokenizeKeyword -from smnp.token.type import TokenType - -def tokenizeReturn(input, current, line): - return tokenizeKeyword(TokenType.RETURN, 'return', input, current, line) diff --git a/smnp/token/tokenizers/type.py b/smnp/token/tokenizers/type.py deleted file mode 100644 index a42f009..0000000 --- a/smnp/token/tokenizers/type.py +++ /dev/null @@ -1,8 +0,0 @@ -from smnp.token.tools import tokenizeKeywords -from smnp.token.type import TokenType -from smnp.type.model import Type - - -def tokenizeType(input, current, line): - types = [ type.name.lower() for type in Type ] - return tokenizeKeywords(TokenType.TYPE, input, current, line, *types) \ No newline at end of file diff --git a/smnp/token/type.py b/smnp/token/type.py index 110fc57..67cf9d4 100644 --- a/smnp/token/type.py +++ b/smnp/token/type.py @@ -23,3 +23,6 @@ class TokenType(Enum): CLOSE_SQUARE = auto() TYPE = auto() EXTEND = auto() + IMPORT = auto() + FROM = auto() + AS = auto() \ No newline at end of file