diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/model/node/MeasureNode.kt b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/MeasureNode.kt new file mode 100644 index 0000000..7508aa7 --- /dev/null +++ b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/MeasureNode.kt @@ -0,0 +1,5 @@ +package io.smnp.dsl.ast.model.node + +import io.smnp.dsl.token.model.entity.TokenPosition + +class MeasureNode(items: List, position: TokenPosition) : AbstractIterableNode(items, position) \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/model/node/StaffNode.kt b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/StaffNode.kt new file mode 100644 index 0000000..3cc44f3 --- /dev/null +++ b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/StaffNode.kt @@ -0,0 +1,5 @@ +package io.smnp.dsl.ast.model.node + +import io.smnp.dsl.token.model.entity.TokenPosition + +class StaffNode(items: List, position: TokenPosition) : AbstractIterableNode(items, position) \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/model/node/TimeSignatureNode.kt b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/TimeSignatureNode.kt new file mode 100644 index 0000000..2d04181 --- /dev/null +++ b/app/src/main/kotlin/io/smnp/dsl/ast/model/node/TimeSignatureNode.kt @@ -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 + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/parser/AtomParser.kt b/app/src/main/kotlin/io/smnp/dsl/ast/parser/AtomParser.kt index bdc83b0..956aba1 100644 --- a/app/src/main/kotlin/io/smnp/dsl/ast/parser/AtomParser.kt +++ b/app/src/main/kotlin/io/smnp/dsl/ast/parser/AtomParser.kt @@ -15,6 +15,7 @@ class AtomParser : Parser() { val literalParser = oneOf( parenthesesParser, ComplexIdentifierParser(), + StaffParser(), ListParser(), LiteralParser(), MapParser() diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/parser/MeasureParser.kt b/app/src/main/kotlin/io/smnp/dsl/ast/parser/MeasureParser.kt new file mode 100644 index 0000000..31c48ac --- /dev/null +++ b/app/src/main/kotlin/io/smnp/dsl/ast/parser/MeasureParser.kt @@ -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) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/parser/StaffParser.kt b/app/src/main/kotlin/io/smnp/dsl/ast/parser/StaffParser.kt new file mode 100644 index 0000000..025e1a9 --- /dev/null +++ b/app/src/main/kotlin/io/smnp/dsl/ast/parser/StaffParser.kt @@ -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) } +) \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/dsl/ast/parser/TimeSignatureParser.kt b/app/src/main/kotlin/io/smnp/dsl/ast/parser/TimeSignatureParser.kt new file mode 100644 index 0000000..0122b94 --- /dev/null +++ b/app/src/main/kotlin/io/smnp/dsl/ast/parser/TimeSignatureParser.kt @@ -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) + } +} \ No newline at end of file