Improve AbstractIterableParser to accept more abstract iterables
This commit is contained in:
@@ -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) ->
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
@@ -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)
|
||||
})
|
||||
@@ -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)
|
||||
})
|
||||
@@ -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)
|
||||
})
|
||||
@@ -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)
|
||||
})
|
||||
@@ -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)
|
||||
})
|
||||
@@ -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)
|
||||
})
|
||||
Reference in New Issue
Block a user