Add imports statements

This commit is contained in:
Bartłomiej Pluta
2019-07-11 10:23:28 +02:00
parent 610266a9d2
commit 3e506354cd
4 changed files with 125 additions and 70 deletions

View File

@@ -43,32 +43,52 @@ class TypeLiteral(Atom):
pass pass
def LiteralParser(input): def IntegerParser(input):
integerParser = Parser.oneOf( return Parser.oneOf(
Parser.terminalParser(TokenType.INTEGER, lambda val, pos: IntegerLiteral.withValue(int(val), pos)), Parser.terminalParser(TokenType.INTEGER, lambda val, pos: IntegerLiteral.withValue(int(val), pos)),
Parser.allOf( Parser.allOf(
Parser.terminalParser(TokenType.MINUS), Parser.terminalParser(TokenType.MINUS),
Parser.terminalParser(TokenType.INTEGER, lambda val, pos: IntegerLiteral.withValue(int(val), pos)), Parser.terminalParser(TokenType.INTEGER, lambda val, pos: IntegerLiteral.withValue(int(val), pos)),
createNode=lambda minus, integer: IntegerLiteral.withValue(-integer.value, minus.pos) createNode=lambda minus, integer: IntegerLiteral.withValue(-integer.value, minus.pos),
name="negative integer"
) )
) )(input)
def StringParser(input):
return Parser.terminalParser(TokenType.STRING, createNode=StringLiteral.withValue)(input)
def NoteParser(input):
return Parser.terminalParser(TokenType.NOTE, createNode=NoteLiteral.withValue)(input)
def BoolParser(input):
return Parser.terminalParser(TokenType.BOOL, createNode=BoolLiteral.withValue)(input)
def TypeParser(input):
return Parser.terminalParser(TokenType.TYPE, createNode=TypeLiteral.withValue)(input)
def LiteralParser(input):
return Parser.oneOf( return Parser.oneOf(
integerParser, IntegerParser,
Parser.terminalParser(TokenType.STRING, createNode=StringLiteral.withValue), StringParser,
Parser.terminalParser(TokenType.NOTE, createNode=NoteLiteral.withValue), NoteParser,
Parser.terminalParser(TokenType.BOOL, createNode=BoolLiteral.withValue), BoolParser,
Parser.terminalParser(TokenType.TYPE, createNode=TypeLiteral.withValue), TypeParser,
name="literal"
)(input) )(input)
def AtomParser(input): def AtomParser(input):
from smnp.ast.node.identifier import IdentifierParser from smnp.ast.node.identifier import IdentifierParser
return Parser.oneOf(
parser = Parser.oneOf(
LiteralParser, LiteralParser,
IdentifierParser, IdentifierParser,
) name="atom"
)(input)
return Parser(parser, "atom", parser)(input)

View File

@@ -1,16 +1,21 @@
from smnp.ast.node.identifier import Identifier # from smnp.ast.node.identifier import Identifier
# from smnp.ast.node.model import Node
# from smnp.ast.node.none import NoneNode
# from smnp.ast.node.string import StringLiteralNode
# from smnp.ast.node.type import TypeNode
# from smnp.ast.parser import Parser
# from smnp.token.type import TokenType
#
from smnp.ast.node.atom import StringParser
from smnp.ast.node.model import Node from smnp.ast.node.model import Node
from smnp.ast.node.none import NoneNode
from smnp.ast.node.string import StringLiteralNode
from smnp.ast.node.type import TypeNode
from smnp.ast.parser import Parser from smnp.ast.parser import Parser
from smnp.token.type import TokenType from smnp.token.type import TokenType
class ImportNode(Node): class Import(Node):
def __init__(self, pos): def __init__(self, pos):
super().__init__(pos) super().__init__(pos)
self.children = [NoneNode(), NoneNode(), NoneNode()] self.children = [None]
@property @property
def source(self): def source(self):
@@ -20,57 +25,85 @@ class ImportNode(Node):
def source(self, value): def source(self, value):
self[0] = 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 @classmethod
def _parse(cls, input): def withValue(cls, value):
return Parser.oneOf( node = cls(value.pos)
cls._literalImportParser(), node.source = value
cls._fileImportParser() return node
)(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( def ImportParser(input):
Parser.terminalParser(TokenType.IMPORT), return Parser.allOf(
TypeNode.parse, Parser.terminalParser(TokenType.IMPORT),
Parser.doAssert(Parser.terminalParser(TokenType.FROM), "'from <source> as <variable name>'"), StringParser,
Parser.doAssert(StringLiteralNode._literalParser(), "source as a string"), createNode=lambda imp, source: Import.withValue(source),
Parser.doAssert(Parser.terminalParser(TokenType.AS), "'as <variable name>'"), name="import"
Parser.doAssert(Identifier.identifierParser(), "variable name"), )(input)
createNode=createNode
)
@classmethod # class ImportNode(Node):
def _fileImportParser(cls): # def __init__(self, pos):
def createNode(importKeyword, source): # super().__init__(pos)
node = ImportNode(importKeyword.pos) # self.children = [NoneNode(), NoneNode(), NoneNode()]
node.source = source #
return node # @property
# def source(self):
return Parser.allOf( # return self[0]
Parser.terminalParser(TokenType.IMPORT), #
Parser.doAssert(StringLiteralNode._literalParser(), "source as a string"), # @source.setter
createNode=createNode # 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.doAssert(Parser.terminalParser(TokenType.FROM), "'from <source> as <variable name>'"),
# Parser.doAssert(StringLiteralNode._literalParser(), "source as a string"),
# Parser.doAssert(Parser.terminalParser(TokenType.AS), "'as <variable name>'"),
# Parser.doAssert(Identifier.identifierParser(), "variable name"),
# 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),
# Parser.doAssert(StringLiteralNode._literalParser(), "source as a string"),
# createNode=createNode
# )

View File

@@ -1,3 +1,4 @@
from smnp.ast.node.imports import ImportParser
from smnp.ast.node.model import Node, ParseResult from smnp.ast.node.model import Node, ParseResult
from smnp.ast.node.statement import StatementParser from smnp.ast.node.statement import StatementParser
from smnp.ast.parser import Parser from smnp.ast.parser import Parser
@@ -12,6 +13,7 @@ def parse(input):
while input.hasCurrent(): while input.hasCurrent():
result = Parser.oneOf( result = Parser.oneOf(
# Start Symbol # Start Symbol
ImportParser,
StatementParser, StatementParser,
exception=RuntimeError("Nie znam tego wyrazenia") exception=RuntimeError("Nie znam tego wyrazenia")
)(input) )(input)

View File

@@ -9,8 +9,8 @@ class Statement(Node):
def StatementParser(input): def StatementParser(input):
from smnp.ast.node.block import BlockParser from smnp.ast.node.block import BlockParser
from smnp.ast.node.condition import IfElseStatementParser from smnp.ast.node.condition import IfElseStatementParser
parser = Parser.oneOf( parser = Parser.oneOf(
IfElseStatementParser, IfElseStatementParser,
BlockParser, BlockParser,