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(
|
val literalParser = oneOf(
|
||||||
parenthesesParser,
|
parenthesesParser,
|
||||||
ComplexIdentifierParser(),
|
ComplexIdentifierParser(),
|
||||||
|
StaffParser(),
|
||||||
ListParser(),
|
ListParser(),
|
||||||
LiteralParser(),
|
LiteralParser(),
|
||||||
MapParser()
|
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