From 71da1e463c2ce716a3ecb9c42880d22211acdd86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 19 Mar 2020 14:09:26 +0100 Subject: [PATCH] Create staff, measure and time signature parsers --- .../io/smnp/dsl/ast/model/node/MeasureNode.kt | 5 +++++ .../io/smnp/dsl/ast/model/node/StaffNode.kt | 5 +++++ .../dsl/ast/model/node/TimeSignatureNode.kt | 14 ++++++++++++++ .../kotlin/io/smnp/dsl/ast/parser/AtomParser.kt | 1 + .../io/smnp/dsl/ast/parser/MeasureParser.kt | 17 +++++++++++++++++ .../io/smnp/dsl/ast/parser/StaffParser.kt | 12 ++++++++++++ .../smnp/dsl/ast/parser/TimeSignatureParser.kt | 17 +++++++++++++++++ 7 files changed, 71 insertions(+) create mode 100644 app/src/main/kotlin/io/smnp/dsl/ast/model/node/MeasureNode.kt create mode 100644 app/src/main/kotlin/io/smnp/dsl/ast/model/node/StaffNode.kt create mode 100644 app/src/main/kotlin/io/smnp/dsl/ast/model/node/TimeSignatureNode.kt create mode 100644 app/src/main/kotlin/io/smnp/dsl/ast/parser/MeasureParser.kt create mode 100644 app/src/main/kotlin/io/smnp/dsl/ast/parser/StaffParser.kt create mode 100644 app/src/main/kotlin/io/smnp/dsl/ast/parser/TimeSignatureParser.kt 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