--wip-- [skip ci]
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user