Introduce some assertions to parsers
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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])
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user