Add 'import' statements

This commit is contained in:
Bartłomiej Pluta
2019-07-06 12:10:58 +02:00
parent bf40c5130c
commit 7b4f4fa8fb
9 changed files with 121 additions and 28 deletions

View File

@@ -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
)

View File

@@ -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)