Refactor parsers
This commit is contained in:
@@ -7,35 +7,35 @@ import io.smnp.dsl.token.model.entity.TokenPosition
|
||||
import io.smnp.dsl.token.model.enumeration.TokenType
|
||||
|
||||
abstract class AbstractIterableParser(
|
||||
private val beginTokenType: TokenType,
|
||||
private val itemParser: Parser,
|
||||
private val endTokenType: TokenType,
|
||||
private val createNode: (List<Node>, TokenPosition) -> Node
|
||||
private val beginTokenType: TokenType,
|
||||
private val itemParser: Parser,
|
||||
private val endTokenType: TokenType,
|
||||
private val createNode: (List<Node>, TokenPosition) -> Node
|
||||
) : Parser() {
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
val emptyIterableParser = allOf(
|
||||
terminal(beginTokenType),
|
||||
terminal(endTokenType)
|
||||
) { createNode(listOf(), it[0].position) }
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
val emptyIterableParser = allOf(
|
||||
terminal(beginTokenType),
|
||||
terminal(endTokenType)
|
||||
) { (beginToken) -> createNode(listOf(), beginToken.position) }
|
||||
|
||||
val nonEmptyIterableParser = allOf(
|
||||
terminal(beginTokenType),
|
||||
allOf(
|
||||
itemParser,
|
||||
optional(repeat(allOf(
|
||||
terminal(TokenType.COMMA),
|
||||
itemParser
|
||||
) { it[1] }) { list, position -> object : Node(list, position) {} }
|
||||
)) { list ->
|
||||
object : Node(listOf(list[0]) + list[1].children, TokenPosition.NONE) {}
|
||||
},
|
||||
terminal(endTokenType)
|
||||
) { createNode(it[1].children.toList(), it[0].position) }
|
||||
val nonEmptyIterableParser = allOf(
|
||||
terminal(beginTokenType),
|
||||
allOf(
|
||||
itemParser,
|
||||
optional(repeat(allOf(
|
||||
terminal(TokenType.COMMA),
|
||||
itemParser
|
||||
) { (_, item) -> item }) { list, position -> object : Node(list, position) {} }
|
||||
)) { (firstItem, otherAggregatedItems) ->
|
||||
object : Node(listOf(firstItem) + otherAggregatedItems.children, TokenPosition.NONE) {}
|
||||
},
|
||||
terminal(endTokenType)
|
||||
) { (beginToken, aggregatedItems) -> createNode(aggregatedItems.children.toList(), beginToken.position) }
|
||||
|
||||
return oneOf(
|
||||
emptyIterableParser,
|
||||
nonEmptyIterableParser
|
||||
).parse(input)
|
||||
}
|
||||
return oneOf(
|
||||
emptyIterableParser,
|
||||
nonEmptyIterableParser
|
||||
).parse(input)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,13 +6,11 @@ import io.smnp.dsl.token.model.entity.TokenList
|
||||
import io.smnp.dsl.token.model.enumeration.TokenType
|
||||
|
||||
class AssignmentOperatorParser : Parser() {
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
return allOf(
|
||||
SimpleIdentifierParser(),
|
||||
terminal(TokenType.ASSIGN),
|
||||
assert(ExpressionParser(), "expression")
|
||||
) {
|
||||
AssignmentOperatorNode(it[0], it[1], it[2])
|
||||
}.parse(input)
|
||||
}
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
return allOf(
|
||||
SimpleIdentifierParser(),
|
||||
terminal(TokenType.ASSIGN),
|
||||
assert(ExpressionParser(), "expression")
|
||||
) { (target, assignToken, value) -> AssignmentOperatorNode(target, assignToken, value) }.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -10,9 +10,7 @@ class AtomParser : Parser() {
|
||||
terminal(TokenType.OPEN_PAREN),
|
||||
ExpressionParser(),
|
||||
terminal(TokenType.CLOSE_PAREN)
|
||||
) {
|
||||
it[1]
|
||||
}
|
||||
) { (_, expression) -> expression }
|
||||
|
||||
val literalParser = oneOf(
|
||||
parenthesesParser,
|
||||
|
||||
@@ -16,8 +16,8 @@ class ExtendParser : Parser() {
|
||||
assert(SimpleIdentifierParser(), "identifier"),
|
||||
terminal(TokenType.WITH),
|
||||
assert(mapNode(FunctionDefinitionParser()) { BlockNode(Node.NONE, listOf(it), Node.NONE) }, "method definition")
|
||||
) {
|
||||
ExtendNode(it[1], it[3], it[5], it[0].position)
|
||||
) { (extendToken, targetType, identifier, method) ->
|
||||
ExtendNode(targetType, identifier, method, extendToken.position)
|
||||
}
|
||||
|
||||
val complexExtendParser = allOf(
|
||||
@@ -28,8 +28,8 @@ class ExtendParser : Parser() {
|
||||
assert(loop(terminal(TokenType.OPEN_CURLY), assert(FunctionDefinitionParser(), "method definition or }"), terminal(TokenType.CLOSE_CURLY)) {
|
||||
begin, methods, end -> BlockNode(begin, methods, end)
|
||||
}, "block with methods' definitions or 'with' keyword with single method definition")
|
||||
) {
|
||||
ExtendNode(it[1], it[3], it[4], it[0].position)
|
||||
) { (extendToken, targetType, identifier, methods) ->
|
||||
ExtendNode(targetType, identifier, methods, extendToken.position)
|
||||
}
|
||||
|
||||
return oneOf(
|
||||
|
||||
@@ -7,25 +7,21 @@ import io.smnp.dsl.token.model.entity.TokenList
|
||||
import io.smnp.dsl.token.model.enumeration.TokenType
|
||||
|
||||
class FactorParser : Parser() {
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
val factorParser = leftAssociativeOperator(
|
||||
UnitParser(),
|
||||
listOf(TokenType.DOUBLE_ASTERISK),
|
||||
assert(UnitParser(), "expression")
|
||||
) { lhs, operator, rhs ->
|
||||
PowerOperatorNode(lhs, operator, rhs)
|
||||
}
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
val factorParser = leftAssociativeOperator(
|
||||
UnitParser(),
|
||||
listOf(TokenType.DOUBLE_ASTERISK),
|
||||
assert(UnitParser(), "expression")
|
||||
) { lhs, operator, rhs -> PowerOperatorNode(lhs, operator, rhs) }
|
||||
|
||||
val notOperatorParser = allOf(
|
||||
terminal(TokenType.NOT),
|
||||
assert(factorParser, "expression")
|
||||
) {
|
||||
NotOperatorNode(it[0], it[1])
|
||||
}
|
||||
val notOperatorParser = allOf(
|
||||
terminal(TokenType.NOT),
|
||||
assert(factorParser, "expression")
|
||||
) { (notToken, expression) -> NotOperatorNode(notToken, expression) }
|
||||
|
||||
return oneOf(
|
||||
notOperatorParser,
|
||||
factorParser
|
||||
).parse(input)
|
||||
}
|
||||
return oneOf(
|
||||
notOperatorParser,
|
||||
factorParser
|
||||
).parse(input)
|
||||
}
|
||||
}
|
||||
@@ -5,12 +5,10 @@ import io.smnp.dsl.ast.model.node.FunctionCallNode
|
||||
import io.smnp.dsl.token.model.entity.TokenList
|
||||
|
||||
class FunctionCallParser : Parser() {
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
return allOf(
|
||||
SimpleIdentifierParser(),
|
||||
FunctionCallArgumentsParser()
|
||||
) {
|
||||
FunctionCallNode(it[0], it[1])
|
||||
}.parse(input)
|
||||
}
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
return allOf(
|
||||
SimpleIdentifierParser(),
|
||||
FunctionCallArgumentsParser()
|
||||
) { (identifier, arguments) -> FunctionCallNode(identifier, arguments) }.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,8 @@ class FunctionDefinitionParser : Parser() {
|
||||
assert(SimpleIdentifierParser(), "function/method name"),
|
||||
assert(FunctionDefinitionArgumentsParser(), "function/method arguments list"),
|
||||
assert(BlockParser(), "function/method body")
|
||||
) {
|
||||
FunctionDefinitionNode(it[1], it[2], it[3], it[0].position)
|
||||
) { (functionToken, identifier, arguments, body) ->
|
||||
FunctionDefinitionNode(identifier, arguments, body, functionToken.position)
|
||||
}.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -14,12 +14,12 @@ class LoopParser : Parser() {
|
||||
mapNode(SimpleIdentifierParser()) { LoopParametersNode(listOf(it), it.position) },
|
||||
LoopParametersParser()
|
||||
), "loop parameters")
|
||||
) { it[1] }
|
||||
) { (_, parameters) -> parameters }
|
||||
|
||||
val loopFilterParser = allOf(
|
||||
terminal(TokenType.PERCENT),
|
||||
assert(SubexpressionParser(), "filter as bool expression")
|
||||
) { it[1] }
|
||||
) { (_, filter) -> filter }
|
||||
|
||||
return allOf(
|
||||
SubexpressionParser(),
|
||||
@@ -27,8 +27,8 @@ class LoopParser : Parser() {
|
||||
terminal(TokenType.CARET),
|
||||
assert(StatementParser(), "statement"),
|
||||
optional(loopFilterParser)
|
||||
) {
|
||||
LoopNode(it[0], it[1], it[2], it[3], it[4])
|
||||
) { (iterator, parameters, caretToken, statement, filter) ->
|
||||
LoopNode(iterator, parameters, caretToken, statement, filter)
|
||||
}.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -16,8 +16,6 @@ class MapEntryParser : Parser() {
|
||||
keyParser,
|
||||
terminal(TokenType.ARROW),
|
||||
assert(SubexpressionParser(), "expression")
|
||||
) {
|
||||
MapEntryNode(it[0], it[1], it[2])
|
||||
}.parse(input)
|
||||
) { (key, arrowToken, value) -> MapEntryNode(key, arrowToken, value) }.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -14,11 +14,11 @@ class OptionalFunctionDefinitionArgumentParser : Parser() {
|
||||
optional(allOf(
|
||||
terminal(TokenType.COLON),
|
||||
assert(TypeParser(), "type name")
|
||||
) { it[1] }) { UnionTypeNode(emptyList(), TokenPosition.NONE) },
|
||||
) { (_, type) -> type }) { UnionTypeNode(emptyList(), TokenPosition.NONE) },
|
||||
terminal(TokenType.ASSIGN),
|
||||
assert(ExpressionParser(), "expression")
|
||||
) {
|
||||
OptionalFunctionDefinitionArgumentNode(it[0], it[1], it[3])
|
||||
) { (identifier, type, defaultValue) ->
|
||||
OptionalFunctionDefinitionArgumentNode(identifier, type, defaultValue)
|
||||
}.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ class RegularFunctionDefinitionArgumentParser : Parser() {
|
||||
optional(allOf(
|
||||
terminal(TokenType.COLON),
|
||||
assert(TypeParser(), "type name")
|
||||
) { it[1] }) { UnionTypeNode(emptyList(), TokenPosition.NONE) }
|
||||
) { (_, type) -> type }) { UnionTypeNode(emptyList(), TokenPosition.NONE) }
|
||||
) { (vararg, identifier, type) ->
|
||||
RegularFunctionDefinitionArgumentNode(identifier, type, vararg)
|
||||
}.parse(input)
|
||||
|
||||
@@ -10,8 +10,6 @@ class SingleTypeParser : Parser() {
|
||||
return allOf(
|
||||
SimpleIdentifierParser(),
|
||||
optional(repeat(TypeSpecifierParser()) { list, tokenPosition -> TypeSpecifiersNode(list, tokenPosition) })
|
||||
) {
|
||||
SingleTypeNode(it[0], it[1])
|
||||
}.parse(input)
|
||||
) { (identifier, specifiers) -> SingleTypeNode(identifier, specifiers) }.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -15,8 +15,6 @@ class StatementParser : Parser() {
|
||||
ThrowParser()
|
||||
),
|
||||
optional(terminal(TokenType.SEMICOLON))
|
||||
) {
|
||||
it[0]
|
||||
}.parse(input)
|
||||
) { (statement) -> statement }.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -10,8 +10,6 @@ class ThrowParser : Parser() {
|
||||
return allOf(
|
||||
terminal(TokenType.THROW),
|
||||
optional(SubexpressionParser())
|
||||
) {
|
||||
ThrowNode(it[1])
|
||||
}.parse(input)
|
||||
) { (_, value) -> ThrowNode(value) }.parse(input)
|
||||
}
|
||||
}
|
||||
@@ -7,21 +7,21 @@ import io.smnp.dsl.token.model.entity.TokenList
|
||||
import io.smnp.dsl.token.model.enumeration.TokenType
|
||||
|
||||
class UnitParser : Parser() {
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
val minusOperatorParser = allOf(
|
||||
terminal(TokenType.MINUS),
|
||||
assert(AtomParser(), "expression")
|
||||
) {
|
||||
MinusOperatorNode(it[0], it[1])
|
||||
}
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
val minusOperatorParser = allOf(
|
||||
terminal(TokenType.MINUS),
|
||||
assert(AtomParser(), "expression")
|
||||
) { (minusToken, expression) -> MinusOperatorNode(minusToken, expression) }
|
||||
|
||||
val atom2 = oneOf(
|
||||
minusOperatorParser,
|
||||
AtomParser()
|
||||
)
|
||||
val atom2 = oneOf(
|
||||
minusOperatorParser,
|
||||
AtomParser()
|
||||
)
|
||||
|
||||
return leftAssociativeOperator(atom2, listOf(TokenType.DOT), assert(atom2, "property or method call")) { lhs, operator, rhs ->
|
||||
AccessOperatorNode(lhs, operator, rhs)
|
||||
}.parse(input)
|
||||
}
|
||||
return leftAssociativeOperator(
|
||||
atom2,
|
||||
listOf(TokenType.DOT),
|
||||
assert(atom2, "property or method call")
|
||||
) { lhs, operator, rhs -> AccessOperatorNode(lhs, operator, rhs) }.parse(input)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user