Improve AbstractIterableParser to accept more abstract iterables

This commit is contained in:
2020-03-19 13:39:03 +01:00
parent 7b742f21da
commit f600308e9c
8 changed files with 48 additions and 31 deletions

View File

@@ -10,6 +10,7 @@ abstract class AbstractIterableParser(
private val beginTokenType: TokenType,
private val itemParser: Parser,
private val endTokenType: TokenType,
private val separator: TokenType = TokenType.COMMA,
private val createNode: (List<Node>, TokenPosition) -> Node
) : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
@@ -23,7 +24,7 @@ abstract class AbstractIterableParser(
allOf(
itemParser,
optional(repeat(allOf(
terminal(TokenType.COMMA),
terminal(separator),
itemParser
) { (_, item) -> item }) { list, position -> object : Node(list, position) {} }
)) { (firstItem, otherAggregatedItems) ->

View File

@@ -4,6 +4,10 @@ import io.smnp.dsl.ast.model.node.FunctionCallArgumentsNode
import io.smnp.dsl.token.model.enumeration.TokenType
class FunctionCallArgumentsParser :
AbstractIterableParser(TokenType.OPEN_PAREN, ExpressionParser(), TokenType.CLOSE_PAREN, { list, tokenPosition ->
FunctionCallArgumentsNode(list, tokenPosition)
})
AbstractIterableParser(
TokenType.OPEN_PAREN,
ExpressionParser(),
TokenType.CLOSE_PAREN,
createNode = { list, tokenPosition ->
FunctionCallArgumentsNode(list, tokenPosition)
})

View File

@@ -4,9 +4,9 @@ import io.smnp.dsl.ast.model.node.FunctionDefinitionArgumentsNode
import io.smnp.dsl.token.model.enumeration.TokenType
class FunctionDefinitionArgumentsParser : AbstractIterableParser(
TokenType.OPEN_PAREN,
FunctionDefinitionArgumentParser(),
TokenType.CLOSE_PAREN,
{ list, tokenPosition ->
FunctionDefinitionArgumentsNode(list, tokenPosition)
})
TokenType.OPEN_PAREN,
FunctionDefinitionArgumentParser(),
TokenType.CLOSE_PAREN,
createNode = { list, tokenPosition ->
FunctionDefinitionArgumentsNode(list, tokenPosition)
})

View File

@@ -4,9 +4,9 @@ import io.smnp.dsl.ast.model.node.ListNode
import io.smnp.dsl.token.model.enumeration.TokenType
class ListParser : AbstractIterableParser(
TokenType.OPEN_SQUARE,
assert(ExpressionParser(), "expression"),
TokenType.CLOSE_SQUARE,
{ list, tokenPosition ->
ListNode(list, tokenPosition)
})
TokenType.OPEN_SQUARE,
assert(ExpressionParser(), "expression"),
TokenType.CLOSE_SQUARE,
createNode = { list, tokenPosition ->
ListNode(list, tokenPosition)
})

View File

@@ -4,9 +4,9 @@ import io.smnp.dsl.ast.model.node.LoopParametersNode
import io.smnp.dsl.token.model.enumeration.TokenType
class LoopParametersParser : AbstractIterableParser(
TokenType.OPEN_PAREN,
assert(SimpleIdentifierParser(), "identifier"),
TokenType.CLOSE_PAREN,
{ list, tokenPosition ->
LoopParametersNode(list, tokenPosition)
})
TokenType.OPEN_PAREN,
assert(SimpleIdentifierParser(), "identifier"),
TokenType.CLOSE_PAREN,
createNode = { list, tokenPosition ->
LoopParametersNode(list, tokenPosition)
})

View File

@@ -4,6 +4,10 @@ import io.smnp.dsl.ast.model.node.MapNode
import io.smnp.dsl.token.model.enumeration.TokenType
class MapParser :
AbstractIterableParser(TokenType.OPEN_CURLY, MapEntryParser(), TokenType.CLOSE_CURLY, { list, tokenPosition ->
MapNode(list, tokenPosition)
})
AbstractIterableParser(
TokenType.OPEN_CURLY,
MapEntryParser(),
TokenType.CLOSE_CURLY,
createNode = { list, tokenPosition ->
MapNode(list, tokenPosition)
})

View File

@@ -4,6 +4,10 @@ import io.smnp.dsl.ast.model.node.TypeSpecifierNode
import io.smnp.dsl.token.model.enumeration.TokenType
class TypeSpecifierParser :
AbstractIterableParser(TokenType.OPEN_ANGLE, SingleTypeParser(), TokenType.CLOSE_ANGLE, { list, tokenPosition ->
TypeSpecifierNode(list, tokenPosition)
})
AbstractIterableParser(
TokenType.OPEN_ANGLE,
SingleTypeParser(),
TokenType.CLOSE_ANGLE,
createNode = { list, tokenPosition ->
TypeSpecifierNode(list, tokenPosition)
})

View File

@@ -3,6 +3,10 @@ package io.smnp.dsl.ast.parser
import io.smnp.dsl.ast.model.node.UnionTypeNode
import io.smnp.dsl.token.model.enumeration.TokenType
class UnionTypeParser : AbstractIterableParser(TokenType.OPEN_ANGLE, SingleTypeParser(), TokenType.CLOSE_ANGLE, { list, tokenPosition ->
UnionTypeNode(list, tokenPosition)
})
class UnionTypeParser : AbstractIterableParser(
TokenType.OPEN_ANGLE,
SingleTypeParser(),
TokenType.CLOSE_ANGLE,
createNode = { list, tokenPosition ->
UnionTypeNode(list, tokenPosition)
})