Create staff, measure and time signature parsers
This commit is contained in:
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ class AtomParser : Parser() {
|
||||
val literalParser = oneOf(
|
||||
parenthesesParser,
|
||||
ComplexIdentifierParser(),
|
||||
StaffParser(),
|
||||
ListParser(),
|
||||
LiteralParser(),
|
||||
MapParser()
|
||||
|
||||
17
app/src/main/kotlin/io/smnp/dsl/ast/parser/MeasureParser.kt
Normal file
17
app/src/main/kotlin/io/smnp/dsl/ast/parser/MeasureParser.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
12
app/src/main/kotlin/io/smnp/dsl/ast/parser/StaffParser.kt
Normal file
12
app/src/main/kotlin/io/smnp/dsl/ast/parser/StaffParser.kt
Normal 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) }
|
||||
)
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user