Introduce some assertions to parsers

This commit is contained in:
2020-03-13 17:56:03 +01:00
parent 6a3bc0de60
commit 764c607a69
14 changed files with 60 additions and 60 deletions

View File

@@ -11,23 +11,23 @@ class ConditionParser : Parser() {
val ifStatementParser = allOf(
terminal(TokenType.IF),
terminal(TokenType.OPEN_PAREN),
SubexpressionParser(),
assert(SubexpressionParser(), "expression"),
terminal(TokenType.CLOSE_PAREN),
StatementParser()
) {
ConditionNode(it[0], it[2], it[4], Node.NONE, Node.NONE)
assert(StatementParser(), "statement")
) { (ifToken, condition, trueBranch) ->
ConditionNode(ifToken, condition, trueBranch, Node.NONE, Node.NONE)
}
val ifElseStatementParser = allOf(
terminal(TokenType.IF),
terminal(TokenType.OPEN_PAREN),
SubexpressionParser(),
assert(SubexpressionParser(), "expression"),
terminal(TokenType.CLOSE_PAREN),
StatementParser(),
assert(StatementParser(), "statement"),
terminal(TokenType.ELSE),
StatementParser()
) {
ConditionNode(it[0], it[2], it[4], it[5], it[6])
assert(StatementParser(), "statement")
) { (ifToken, condition, trueBranch, elseToken, falseBranch) ->
ConditionNode(ifToken, condition, trueBranch, elseToken, falseBranch)
}
return oneOf(

View File

@@ -11,14 +11,14 @@ class FactorParser : Parser() {
val factorParser = leftAssociativeOperator(
UnitParser(),
listOf(TokenType.DOUBLE_ASTERISK),
UnitParser()
assert(UnitParser(), "expression")
) { lhs, operator, rhs ->
PowerOperatorNode(lhs, operator, rhs)
}
val notOperatorParser = allOf(
terminal(TokenType.NOT),
factorParser
assert(factorParser, "expression")
) {
NotOperatorNode(it[0], it[1])
}

View File

@@ -5,9 +5,9 @@ import io.smnp.dsl.token.model.entity.TokenList
class FunctionDefinitionArgumentParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return oneOf(
return assert(oneOf(
OptionalFunctionDefinitionArgumentParser(),
RegularFunctionDefinitionArgumentParser()
).parse(input)
), "optional or regular argument definition").parse(input)
}
}

View File

@@ -22,7 +22,7 @@ class ImportParser : Parser() {
return allOf(
terminal(TokenType.IMPORT),
pathParser
assert(pathParser, "module canonical name")
) { (import, path) ->
ImportNode(path.children, import.position)
}.parse(input)

View File

@@ -5,7 +5,7 @@ import io.smnp.dsl.token.model.enumeration.TokenType
class ListParser : AbstractIterableParser(
TokenType.OPEN_SQUARE,
SubexpressionParser(),
assert(SubexpressionParser(), "expression"),
TokenType.CLOSE_SQUARE,
{ list, tokenPosition ->
ListNode(list, tokenPosition)

View File

@@ -5,7 +5,7 @@ import io.smnp.dsl.token.model.enumeration.TokenType
class LoopParametersParser : AbstractIterableParser(
TokenType.OPEN_PAREN,
SimpleIdentifierParser(),
assert(SimpleIdentifierParser(), "identifier"),
TokenType.CLOSE_PAREN,
{ list, tokenPosition ->
LoopParametersNode(list, tokenPosition)

View File

@@ -10,10 +10,10 @@ class LoopParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
val loopParametersParser = allOf(
terminal(TokenType.AS),
oneOf(
assert(oneOf(
mapNode(SimpleIdentifierParser()) { LoopParametersNode(listOf(it), it.position) },
LoopParametersParser()
)
), "loop parameters")
) { it[1] }
val loopFilterParser = allOf(
@@ -25,7 +25,7 @@ class LoopParser : Parser() {
SubexpressionParser(),
optional(loopParametersParser),
terminal(TokenType.CARET),
StatementParser(),
assert(StatementParser(), "statement"),
optional(loopFilterParser)
) {
LoopNode(it[0], it[1], it[2], it[3], it[4])

View File

@@ -13,7 +13,7 @@ class OptionalFunctionDefinitionArgumentParser : Parser() {
SimpleIdentifierParser(),
optional(allOf(
terminal(TokenType.COLON),
TypeParser()
assert(TypeParser(), "type name")
) { it[1] }) { UnionTypeNode(emptyList(), TokenPosition.NONE) },
terminal(TokenType.ASSIGN),
assert(ExpressionParser(), "expression")

View File

@@ -14,7 +14,7 @@ class RegularFunctionDefinitionArgumentParser : Parser() {
SimpleIdentifierParser(),
optional(allOf(
terminal(TokenType.COLON),
TypeParser()
assert(TypeParser(), "type name")
) { it[1] }) { UnionTypeNode(emptyList(), TokenPosition.NONE) }
) { (vararg, identifier, type) ->
RegularFunctionDefinitionArgumentNode(identifier, type, vararg)

View File

@@ -9,9 +9,9 @@ class ReturnParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return allOf(
terminal(TokenType.RETURN),
optional(ExpressionParser())
) {
ReturnNode(it[1])
optional(assert(ExpressionParser(), "expression"))
) { (_, value) ->
ReturnNode(value)
}.parse(input)
}
}

View File

@@ -7,7 +7,7 @@ import io.smnp.dsl.token.model.enumeration.TokenType
class RootParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return repeat(
return assert(repeat(
oneOf(
allOf(ImportParser(), optional(terminal(TokenType.SEMICOLON))) { (import, _) -> import },
FunctionDefinitionParser(),
@@ -16,6 +16,6 @@ class RootParser : Parser() {
)
) { list, tokenPosition ->
RootNode(list, tokenPosition)
}.parse(input)
}, "import statement, function definition, extend statement or any other statement").parse(input)
}
}

View File

@@ -8,39 +8,39 @@ import io.smnp.dsl.token.model.entity.TokenList
import io.smnp.dsl.token.model.enumeration.TokenType
class SubexpressionParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
val expr1Parser = leftAssociativeOperator(
TermParser(),
listOf(TokenType.PLUS, TokenType.MINUS),
TermParser()
) { lhs, operator, rhs ->
SumOperatorNode(lhs, operator, rhs)
}
override fun tryToParse(input: TokenList): ParserOutput {
val expr1Parser = leftAssociativeOperator(
TermParser(),
listOf(TokenType.PLUS, TokenType.MINUS),
assert(TermParser(), "expression")
) { lhs, operator, rhs ->
SumOperatorNode(lhs, operator, rhs)
}
val expr2Parser = leftAssociativeOperator(
expr1Parser,
listOf(TokenType.AND),
expr1Parser
) { lhs, operator, rhs ->
LogicOperatorNode(lhs, operator, rhs)
}
val expr2Parser = leftAssociativeOperator(
expr1Parser,
listOf(TokenType.AND),
assert(expr1Parser, "expression")
) { lhs, operator, rhs ->
LogicOperatorNode(lhs, operator, rhs)
}
val expr3Parser = leftAssociativeOperator(
expr2Parser,
listOf(TokenType.OR),
expr2Parser
) { lhs, operator, rhs ->
LogicOperatorNode(lhs, operator, rhs)
}
val expr3Parser = leftAssociativeOperator(
expr2Parser,
listOf(TokenType.OR),
assert(expr2Parser, "expression")
) { lhs, operator, rhs ->
LogicOperatorNode(lhs, operator, rhs)
}
val expr4Parser = leftAssociativeOperator(
expr3Parser,
listOf(TokenType.RELATION, TokenType.OPEN_ANGLE, TokenType.CLOSE_ANGLE),
expr3Parser
) { lhs, operator, rhs ->
RelationOperatorNode(lhs, operator, rhs)
}
val expr4Parser = leftAssociativeOperator(
expr3Parser,
listOf(TokenType.RELATION, TokenType.OPEN_ANGLE, TokenType.CLOSE_ANGLE),
assert(expr3Parser, "expression")
) { lhs, operator, rhs ->
RelationOperatorNode(lhs, operator, rhs)
}
return expr4Parser.parse(input)
}
return expr4Parser.parse(input)
}
}

View File

@@ -10,7 +10,7 @@ class TermParser : Parser() {
return leftAssociativeOperator(
FactorParser(),
listOf(TokenType.ASTERISK, TokenType.SLASH),
FactorParser()
assert(FactorParser(), "expression")
) { lhs, operator, rhs ->
ProductOperatorNode(lhs, operator, rhs)
}.parse(input)

View File

@@ -10,7 +10,7 @@ class UnitParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
val minusOperatorParser = allOf(
terminal(TokenType.MINUS),
assert(AtomParser(), "atom")
assert(AtomParser(), "expression")
) {
MinusOperatorNode(it[0], it[1])
}
@@ -20,7 +20,7 @@ class UnitParser : Parser() {
AtomParser()
)
return leftAssociativeOperator(atom2, listOf(TokenType.DOT), assert(atom2, "atom")) { lhs, operator, rhs ->
return leftAssociativeOperator(atom2, listOf(TokenType.DOT), assert(atom2, "property or method call")) { lhs, operator, rhs ->
AccessOperatorNode(lhs, operator, rhs)
}.parse(input)
}