diff --git a/antlr-kotlin-tests/antlr/BracketsParser.g4 b/antlr-kotlin-tests/antlr/BracketsParser.g4 new file mode 100644 index 00000000..4580a3b7 --- /dev/null +++ b/antlr-kotlin-tests/antlr/BracketsParser.g4 @@ -0,0 +1,15 @@ +parser grammar BracketsParser; + +tokens { + LEFT, RIGHT +} + +options { + TokenLabelType=BracketToken; +} + +@header { + import com.strumenta.antlrkotlin.test.BracketToken +} + +matched: left=LEFT matched* left=RIGHT; \ No newline at end of file diff --git a/antlr-kotlin-tests/src/commonMain/kotlin/com/strumenta/antlrkotlin/test/BracketToken.kt b/antlr-kotlin-tests/src/commonMain/kotlin/com/strumenta/antlrkotlin/test/BracketToken.kt new file mode 100644 index 00000000..4305df9d --- /dev/null +++ b/antlr-kotlin-tests/src/commonMain/kotlin/com/strumenta/antlrkotlin/test/BracketToken.kt @@ -0,0 +1,9 @@ +package com.strumenta.antlrkotlin.test + +import org.antlr.v4.kotlinruntime.CommonToken +import org.antlr.v4.kotlinruntime.Token + +public sealed interface BracketToken : Token { + public class Left(text: String) : CommonToken(1, text), BracketToken + public class Right(text: String) : CommonToken(2, text), BracketToken +} \ No newline at end of file diff --git a/antlr-kotlin-tests/src/commonTest/kotlin/com/strumenta/antlrkotlin/test/grammars/BracketsTest.kt b/antlr-kotlin-tests/src/commonTest/kotlin/com/strumenta/antlrkotlin/test/grammars/BracketsTest.kt new file mode 100644 index 00000000..753e444e --- /dev/null +++ b/antlr-kotlin-tests/src/commonTest/kotlin/com/strumenta/antlrkotlin/test/grammars/BracketsTest.kt @@ -0,0 +1,41 @@ +package com.strumenta.antlrkotlin.test.grammars + +import com.strumenta.antlrkotlin.test.BracketToken.Left +import com.strumenta.antlrkotlin.test.BracketToken.Right +import com.strumenta.antlrkotlin.test.ThrowingErrorListener +import com.strumenta.antlrkotlin.test.generated.BracketsParser +import com.strumenta.antlrkotlin.util.loadResourceText +import org.antlr.v4.kotlinruntime.ListTokenSource +import org.antlr.v4.kotlinruntime.UnbufferedTokenStream +import org.antlr.v4.kotlinruntime.tree.Trees +import kotlin.test.Test +import kotlin.test.assertEquals + +@Suppress("unused") +class BracketsTest { + + @Test + fun parsesMatched() { + // Create the parser + val tokenStream = UnbufferedTokenStream( + ListTokenSource( + listOf( + Left("("), Left("["), Right("]"), + Left("{"), Right("}"), Right(")") + ) + ) + ) + val parser = BracketsParser(tokenStream) + parser.addErrorListener(ThrowingErrorListener) + val tree = parser.matched() + val lispTree = Trees.toStringTree(tree, parser) + + val expectedLispTreeText = loadResourceText("src/commonTest/resources/brackets/matched.tree") + + assertEquals( + expected = expectedLispTreeText, + actual = lispTree, + message = "Outputted LISP tree does not match the expected tree", + ) + } +} diff --git a/antlr-kotlin-tests/src/commonTest/resources/brackets/matched.tree b/antlr-kotlin-tests/src/commonTest/resources/brackets/matched.tree new file mode 100644 index 00000000..fe00111f --- /dev/null +++ b/antlr-kotlin-tests/src/commonTest/resources/brackets/matched.tree @@ -0,0 +1 @@ +(matched ( (matched [ ]) (matched { }) )) \ No newline at end of file