Create staff, measure and time signature parsers

This commit is contained in:
2020-03-19 14:09:26 +01:00
parent f600308e9c
commit 71da1e463c
7 changed files with 71 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
package io.smnp.dsl.ast.model.node
import io.smnp.dsl.token.model.entity.TokenPosition
class MeasureNode(items: List<Node>, position: TokenPosition) : AbstractIterableNode(items, position)

View File

@@ -0,0 +1,5 @@
package io.smnp.dsl.ast.model.node
import io.smnp.dsl.token.model.entity.TokenPosition
class StaffNode(items: List<Node>, position: TokenPosition) : AbstractIterableNode(items, position)

View File

@@ -0,0 +1,14 @@
package io.smnp.dsl.ast.model.node
class TimeSignatureNode(numerator: Node, denominator: Node) : Node(2, numerator.position) {
val numerator: Node
get() = children[0]
val denominator: Node
get() = children[1]
init {
children[0] = numerator
children[1] = denominator
}
}

View File

@@ -15,6 +15,7 @@ class AtomParser : Parser() {
val literalParser = oneOf(
parenthesesParser,
ComplexIdentifierParser(),
StaffParser(),
ListParser(),
LiteralParser(),
MapParser()

View File

@@ -0,0 +1,17 @@
package io.smnp.dsl.ast.parser
import io.smnp.dsl.ast.model.entity.ParserOutput
import io.smnp.dsl.ast.model.node.MeasureNode
import io.smnp.dsl.token.model.entity.TokenList
class MeasureParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return repeat(
oneOf(
TimeSignatureParser(),
ExpressionParser()
)
) { items, position -> MeasureNode(items, position) }.parse(input)
}
}

View File

@@ -0,0 +1,12 @@
package io.smnp.dsl.ast.parser
import io.smnp.dsl.ast.model.node.StaffNode
import io.smnp.dsl.token.model.enumeration.TokenType
class StaffParser : AbstractIterableParser(
TokenType.DOLLAR,
MeasureParser(),
TokenType.DOUBLE_PIPE,
TokenType.PIPE,
{ items, position -> StaffNode(items, position) }
)

View File

@@ -0,0 +1,17 @@
package io.smnp.dsl.ast.parser
import io.smnp.dsl.ast.model.entity.ParserOutput
import io.smnp.dsl.ast.model.node.TimeSignatureNode
import io.smnp.dsl.token.model.entity.TokenList
import io.smnp.dsl.token.model.enumeration.TokenType
class TimeSignatureParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return allOf(
IntegerLiteralParser(),
terminal(TokenType.SLASH),
IntegerLiteralParser()
) { (numerator, _, denominator) -> TimeSignatureNode(numerator, denominator) }.parse(input)
}
}