--wip-- [skip ci]

This commit is contained in:
Bartłomiej Pluta
2019-07-11 19:36:25 +02:00
parent e7674a4834
commit 49e4c4487e
5 changed files with 46 additions and 32 deletions

View File

@@ -1,3 +1,4 @@
from smnp.ast.node.list import ListParser
from smnp.ast.node.operator import BinaryOperator from smnp.ast.node.operator import BinaryOperator
from smnp.ast.node.valuable import Valuable from smnp.ast.node.valuable import Valuable
from smnp.ast.parser import Parsers from smnp.ast.parser import Parsers
@@ -15,7 +16,7 @@ def ChainParser():
from smnp.ast.node.atom import AtomParser from smnp.ast.node.atom import AtomParser
itemParser = Parsers.oneOf( itemParser = Parsers.oneOf(
#ListParser, ListParser,
#MapParser, #MapParser,
AtomParser, AtomParser,
name="chainItem" name="chainItem"

View File

@@ -1,7 +1,7 @@
from smnp.ast.node.ignore import IgnoredNode from smnp.ast.node.ignore import IgnoredNode
from smnp.ast.node.model import Node, ParseResult from smnp.ast.node.model import Node, ParseResult
from smnp.ast.node.none import NoneNode from smnp.ast.node.none import NoneNode
from smnp.ast.parser import Parsers from smnp.ast.parser import Parsers, DecoratorParser
from smnp.token.type import TokenType from smnp.token.type import TokenType
@@ -31,14 +31,14 @@ def abstractIterableParser(iterableNodeType, openTokenType, closeTokenType, item
class AbstractIterableTail(AbstractIterable): class AbstractIterableTail(AbstractIterable):
pass pass
def abstractIterableParser(input): def abstractIterableParser():
return Parsers.oneOf( return Parsers.oneOf(
emptyIterable, emptyIterable(),
openIterable, openIterable(),
name=name name=name
)(input) )
def emptyIterable(input): def emptyIterable():
def createNode(open, close): def createNode(open, close):
node = AbstractIterable(open.pos) node = AbstractIterable(open.pos)
node.value = open node.value = open
@@ -50,9 +50,9 @@ def abstractIterableParser(iterableNodeType, openTokenType, closeTokenType, item
Parsers.terminal(closeTokenType), Parsers.terminal(closeTokenType),
createNode=createNode, createNode=createNode,
name=name+"Empty" name=name+"Empty"
)(input) )
def openIterable(input): def openIterable():
def createNode(open, item, tail): def createNode(open, item, tail):
node = AbstractIterable(open.pos) node = AbstractIterable(open.pos)
node.value = item node.value = item
@@ -62,19 +62,19 @@ def abstractIterableParser(iterableNodeType, openTokenType, closeTokenType, item
return Parsers.allOf( return Parsers.allOf(
Parsers.terminal(openTokenType), Parsers.terminal(openTokenType),
itemParser, itemParser,
abstractIterableTailParser, abstractIterableTailParser(),
createNode=createNode, createNode=createNode,
name=name+"Open" name=name+"Open"
)(input) )
def abstractIterableTailParser(input): def abstractIterableTailParser():
return Parsers.oneOf( return Parsers.oneOf(
closeIterable, closeIterable(),
nextItem, nextItem(),
name=name+"Tail" name=name+"Tail"
)(input) )
def nextItem(input): def nextItem():
def createNode(comma, item, tail): def createNode(comma, item, tail):
node = AbstractIterableTail(item.pos) node = AbstractIterableTail(item.pos)
node.value = item node.value = item
@@ -84,22 +84,21 @@ def abstractIterableParser(iterableNodeType, openTokenType, closeTokenType, item
return Parsers.allOf( return Parsers.allOf(
Parsers.terminal(TokenType.COMMA, doAssert=True), Parsers.terminal(TokenType.COMMA, doAssert=True),
itemParser, itemParser,
abstractIterableTailParser, abstractIterableTailParser(),
name=name+"NextItem", name=name+"NextItem",
createNode=createNode createNode=createNode
)(input) )
def closeIterable(input): def closeIterable():
return Parsers.terminal(closeTokenType)(input) return Parsers.terminal(closeTokenType)
return toFlatDesiredNode(iterableNodeType, abstractIterableParser) return abstractIterableParser()
#return toFlatDesiredNode(iterableNodeType, abstractIterableParser())
def toFlatDesiredNode(iterableNodeType, parser): def toFlatDesiredNode(iterableNodeType, parser):
def parse(input): def wrapper(result):
result = parser(input)
if result.result: if result.result:
value = flattenList(result.node) value = flattenList(result.node)
node = iterableNodeType(result.node.pos) node = iterableNodeType(result.node.pos)
@@ -110,7 +109,7 @@ def toFlatDesiredNode(iterableNodeType, parser):
return ParseResult.FAIL() return ParseResult.FAIL()
#return Parser(parse, "flat", [parser]) return DecoratorParser(wrapper, parser)
def flattenList(node, output=None): def flattenList(node, output=None):

View File

@@ -1,3 +1,4 @@
from smnp.ast.node.atom import AtomParser
from smnp.ast.node.iterable import abstractIterableParser from smnp.ast.node.iterable import abstractIterableParser
from smnp.ast.node.model import Node from smnp.ast.node.model import Node
from smnp.token.type import TokenType from smnp.token.type import TokenType
@@ -7,7 +8,6 @@ class List(Node):
pass pass
def ListParser(input): def ListParser():
from smnp.ast.node.expression import MaxPrecedenceExpressionParser return abstractIterableParser(List, TokenType.OPEN_SQUARE, TokenType.CLOSE_SQUARE, AtomParser(), name="list")
return abstractIterableParser(List, TokenType.OPEN_SQUARE, TokenType.CLOSE_SQUARE, #MaxPrecedenceExpressionParser)(input)
MaxPrecedenceExpressionParser)(input)

View File

@@ -81,6 +81,18 @@ class Parsers:
return LoopParser(startParser, itemParser, endParser, createNode, name) return LoopParser(startParser, itemParser, endParser, createNode, name)
class DecoratorParser(Parser):
def __init__(self, wrapper, parser):
super().__init__(parser.name)
self.wrapper = wrapper
self.parser = parser
self._grammarRules = parser._grammarRules
def _parse(self, input):
result = self.parser.parse(input)
return self.wrapper(result)
class TerminalParser(Parser): class TerminalParser(Parser):
def __init__(self, expectedType, createNode=lambda val, pos: IgnoredNode(pos), doAssert=False): def __init__(self, expectedType, createNode=lambda val, pos: IgnoredNode(pos), doAssert=False):

View File

@@ -1,4 +1,6 @@
from smnp.ast.node.atom import AtomParser from smnp.ast.node.atom import AtomParser
from smnp.ast.node.chain import ChainParser
from smnp.ast.node.list import ListParser
from smnp.ast.node.model import Node from smnp.ast.node.model import Node
from smnp.error.base import SmnpException from smnp.error.base import SmnpException
from smnp.token.tokenizer import tokenize from smnp.token.tokenizer import tokenize
@@ -15,9 +17,9 @@ def main():
super().__init__((-1, -1)) super().__init__((-1, -1))
self.children = children self.children = children
tokens = tokenize(['"fsfsvd" "Fsefs"']) tokens = tokenize(['[1, 2]'])
parser = AtomParser() parser = ListParser()
print(parser.grammar()) #print(parser.grammar())
res = parser.parse(tokens) res = parser.parse(tokens)
print() print()