From 6184619dee9555f5daf78aa7ee453dd6a1b11fe3 Mon Sep 17 00:00:00 2001 From: Patrick Del Conte Date: Sat, 14 Apr 2018 14:28:43 +0200 Subject: [PATCH 1/5] implemented ArrayPredictionContext equals added Arrays.equals for IntArray and nullable Arrays --- .../com/strumenta/kotlinmultiplatform/Misc.kt | 18 ++++++++++++++---- .../atn/ArrayPredictionContext.kt | 8 +++++--- .../strumenta/kotlinmultiplatform/arrays.kt | 13 +++++++++++++ .../strumenta/kotlinmultiplatform/arrays.kt | 4 ++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/antlr-kotlin-runtime-common/src/main/kotlin/com/strumenta/kotlinmultiplatform/Misc.kt b/antlr-kotlin-runtime-common/src/main/kotlin/com/strumenta/kotlinmultiplatform/Misc.kt index 8151d7e..5a817c1 100644 --- a/antlr-kotlin-runtime-common/src/main/kotlin/com/strumenta/kotlinmultiplatform/Misc.kt +++ b/antlr-kotlin-runtime-common/src/main/kotlin/com/strumenta/kotlinmultiplatform/Misc.kt @@ -27,12 +27,24 @@ expect object Arrays { fun equals(a: Array<*>, b: Array<*>): Boolean + fun equals(a: IntArray, b: IntArray): Boolean + fun toString(a: Array<*>): String } -expect class BitSet { - constructor() +fun Arrays.equals(a: Array<*>?, b: Array<*>?): Boolean { + if (a == null && b == null) return true + if (a == null && b != null || a != null && b == null) return false + return equals(a!!, b!!) +} +fun Arrays.equals(a: IntArray?, b: IntArray?): Boolean { + if (a == null && b == null) return true + if (a == null && b != null || a != null && b == null) return false + return equals(a!!, b!!) +} + +expect class BitSet() { fun set(bitIndex: Int) fun clear(bitIndex: Int) fun get(bitIndex: Int): Boolean @@ -41,8 +53,6 @@ expect class BitSet { fun or(alts: BitSet) } -//expect class ArrayList : List - expect object Collections { fun unmodifiableList(asList: Collection<*>): List<*> fun unmodifiableMap(t: T): U diff --git a/antlr-kotlin-runtime-common/src/main/kotlin/org/antlr/v4/kotlinruntime/atn/ArrayPredictionContext.kt b/antlr-kotlin-runtime-common/src/main/kotlin/org/antlr/v4/kotlinruntime/atn/ArrayPredictionContext.kt index aff7fcb..e680e40 100644 --- a/antlr-kotlin-runtime-common/src/main/kotlin/org/antlr/v4/kotlinruntime/atn/ArrayPredictionContext.kt +++ b/antlr-kotlin-runtime-common/src/main/kotlin/org/antlr/v4/kotlinruntime/atn/ArrayPredictionContext.kt @@ -6,6 +6,9 @@ package org.antlr.v4.kotlinruntime.atn +import com.strumenta.kotlinmultiplatform.Arrays +import com.strumenta.kotlinmultiplatform.equals + class ArrayPredictionContext( /** Parent can be null only if full ctx mode and we make an array * from [.EMPTY] and non-empty. We merge [.EMPTY] by using null parent and @@ -57,9 +60,8 @@ class ArrayPredictionContext( return false // can't be same if hash is different } - val a = o as ArrayPredictionContext? - TODO() - //return Arrays.equals(returnStates, a!!.returnStates) && Arrays.equals(parents, a.parents) + o as ArrayPredictionContext + return Arrays.equals(returnStates, o.returnStates) && Arrays.equals(parents, o.parents) } // // override fun toString(): String { diff --git a/antlr-kotlin-runtime-js/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt b/antlr-kotlin-runtime-js/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt index 9c2112a..b297e93 100644 --- a/antlr-kotlin-runtime-js/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt +++ b/antlr-kotlin-runtime-js/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt @@ -39,6 +39,19 @@ actual object Arrays { return true } + actual fun equals(a: IntArray, b: IntArray): Boolean { + if (a === b) return true + if (a.size != b.size) { + return false + } + for (i in a.indices) { + if (a[i] != b[i]) { + return false + } + } + return true + } + actual fun toString(a: Array<*>): String { return "[${a.joinToString(separator = ", ") { it?.toString() ?: "null"}}]" } diff --git a/antlr-kotlin-runtime-jvm/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt b/antlr-kotlin-runtime-jvm/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt index 57bed57..f900d6d 100644 --- a/antlr-kotlin-runtime-jvm/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt +++ b/antlr-kotlin-runtime-jvm/src/main/kotlin/com/strumenta/kotlinmultiplatform/arrays.kt @@ -28,6 +28,10 @@ actual object Arrays { return java.util.Arrays.equals(a, b) } + actual fun equals(a: IntArray, b: IntArray): Boolean { + return java.util.Arrays.equals(a, b) + } + actual fun toString(a: Array<*>): String { return java.util.Arrays.toString(a) } From d418c80d94039bbceef797ddfd1731dc57c09725 Mon Sep 17 00:00:00 2001 From: Patrick Del Conte Date: Sat, 14 Apr 2018 14:38:26 +0200 Subject: [PATCH 2/5] Terminals int context are nullable --- .../org/antlr/v4/tool/templates/codegen/Kotlin/Kotlin.stg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/antlr-kotlin-target/src/main/resources/org/antlr/v4/tool/templates/codegen/Kotlin/Kotlin.stg b/antlr-kotlin-target/src/main/resources/org/antlr/v4/tool/templates/codegen/Kotlin/Kotlin.stg index 334d9ec..d26aac1 100644 --- a/antlr-kotlin-target/src/main/resources/org/antlr/v4/tool/templates/codegen/Kotlin/Kotlin.stg +++ b/antlr-kotlin-target/src/main/resources/org/antlr/v4/tool/templates/codegen/Kotlin/Kotlin.stg @@ -705,11 +705,11 @@ RuleContextDecl(r) ::= "var : ? = null" RuleContextListDecl(rdecl) ::= "var : MutableList\<> = ArrayList\<>()" ContextTokenGetterDecl(t) ::= - "fun () : TerminalNode = getToken(.Tokens..id, 0) as TerminalNode" + "fun () : TerminalNode? = getToken(.Tokens..id, 0)" ContextTokenListGetterDecl(t) ::= - "fun () : List\ = getTokens(.Tokens..id) as TerminalNode" + "fun () : List\ = getTokens(.Tokens..id)" ContextTokenListIndexedGetterDecl(t) ::= << -fun (int i) : TerminalNode = getToken(.Tokens..id, i) as TerminalNode +fun (int i) : TerminalNode? = getToken(.Tokens..id, i) >> ContextRuleGetterDecl(r) ::= << fun find() : ? = getRuleContext(solver.getType(""),0) From 737cded1420dd1cadea52e5e41fd5f3298ae16cb Mon Sep 17 00:00:00 2001 From: Patrick Del Conte Date: Thu, 26 Apr 2018 22:18:36 +0200 Subject: [PATCH 3/5] update Kotlin to 1.2.40 --- antlr-kotlin-examples-js/build.gradle | 2 +- antlr-kotlin-examples-jvm/build.gradle | 2 +- antlr-kotlin-gradle-plugin/build.gradle | 2 +- antlr-kotlin-runtime-common/build.gradle | 2 +- antlr-kotlin-runtime-js/build.gradle | 2 +- antlr-kotlin-runtime-jvm/build.gradle | 2 +- antlr-kotlin-target/build.gradle | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/antlr-kotlin-examples-js/build.gradle b/antlr-kotlin-examples-js/build.gradle index 0eb1449..d7f01e7 100644 --- a/antlr-kotlin-examples-js/build.gradle +++ b/antlr-kotlin-examples-js/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.10' + ext.kotlin_version = '1.2.40' repositories { mavenCentral() diff --git a/antlr-kotlin-examples-jvm/build.gradle b/antlr-kotlin-examples-jvm/build.gradle index 5748cf0..2f3da43 100644 --- a/antlr-kotlin-examples-jvm/build.gradle +++ b/antlr-kotlin-examples-jvm/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.10' + ext.kotlin_version = '1.2.40' repositories { mavenCentral() diff --git a/antlr-kotlin-gradle-plugin/build.gradle b/antlr-kotlin-gradle-plugin/build.gradle index b140403..16a0eed 100644 --- a/antlr-kotlin-gradle-plugin/build.gradle +++ b/antlr-kotlin-gradle-plugin/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.31' + ext.kotlin_version = '1.2.40' repositories { mavenCentral() diff --git a/antlr-kotlin-runtime-common/build.gradle b/antlr-kotlin-runtime-common/build.gradle index 0acaba9..e768b73 100644 --- a/antlr-kotlin-runtime-common/build.gradle +++ b/antlr-kotlin-runtime-common/build.gradle @@ -1,6 +1,6 @@ buildscript { - ext.kotlin_version = '1.2.31' + ext.kotlin_version = '1.2.40' repositories { mavenCentral() diff --git a/antlr-kotlin-runtime-js/build.gradle b/antlr-kotlin-runtime-js/build.gradle index 77356ee..5bf4f1b 100644 --- a/antlr-kotlin-runtime-js/build.gradle +++ b/antlr-kotlin-runtime-js/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.31' + ext.kotlin_version = '1.2.40' repositories { mavenCentral() diff --git a/antlr-kotlin-runtime-jvm/build.gradle b/antlr-kotlin-runtime-jvm/build.gradle index 1aeaff4..dcca60d 100644 --- a/antlr-kotlin-runtime-jvm/build.gradle +++ b/antlr-kotlin-runtime-jvm/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.31' + ext.kotlin_version = '1.2.40' repositories { mavenCentral() diff --git a/antlr-kotlin-target/build.gradle b/antlr-kotlin-target/build.gradle index 319389a..bc47fd3 100644 --- a/antlr-kotlin-target/build.gradle +++ b/antlr-kotlin-target/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.31' + ext.kotlin_version = '1.2.40' repositories { mavenLocal() From 5bac4732858ba8a6a71fff7546d76930b7c6482a Mon Sep 17 00:00:00 2001 From: Patrick Del Conte Date: Thu, 26 Apr 2018 22:53:27 +0200 Subject: [PATCH 4/5] fixed compile error in tests --- .../src/test/kotlin/MiniCalcParserTest.kt | 9 ++++----- .../src/test/kotlin/MiniCalcParserTest.kt | 12 ++++-------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/antlr-kotlin-examples-js/src/test/kotlin/MiniCalcParserTest.kt b/antlr-kotlin-examples-js/src/test/kotlin/MiniCalcParserTest.kt index 5365378..8eac97c 100644 --- a/antlr-kotlin-examples-js/src/test/kotlin/MiniCalcParserTest.kt +++ b/antlr-kotlin-examples-js/src/test/kotlin/MiniCalcParserTest.kt @@ -2,10 +2,9 @@ import org.antlr.v4.kotlinruntime.ANTLRInputStream import org.antlr.v4.kotlinruntime.CommonTokenStream import org.antlr.v4.kotlinruntime.ast.Point import org.antlr.v4.kotlinruntime.ast.pos -import org.antlr.v4.kotlinruntime.atn.EmptyPredictionContext -import org.antlr.v4.kotlinruntime.atn.PredictionContext import org.antlr.v4.kotlinruntime.tree.TerminalNode -import kotlin.test.* +import kotlin.test.assertEquals +import kotlin.test.assertTrue import kotlin.test.Test as test class TestingParser { @@ -66,12 +65,12 @@ class TestingParser { val inputDecl = statement.findInputDeclaration()!! val inputKw = inputDecl.INPUT() - assertEquals("input", inputKw.text) + assertEquals("input", inputKw?.text) val type = inputDecl.findType()!! val intKw = (type as MiniCalcParser.IntegerContext).INT() - assertEquals("Int", intKw.text) + assertEquals("Int", intKw?.text) val id = inputDecl.ID()!! assertEquals("width", id.text) diff --git a/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt b/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt index 357bfd1..7196fe0 100644 --- a/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt +++ b/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt @@ -2,17 +2,13 @@ import org.antlr.v4.kotlinruntime.ANTLRInputStream import org.antlr.v4.kotlinruntime.CommonTokenStream import org.antlr.v4.kotlinruntime.ast.Point import org.antlr.v4.kotlinruntime.ast.pos -import org.antlr.v4.kotlinruntime.atn.EmptyPredictionContext -import org.antlr.v4.kotlinruntime.atn.PredictionContext import org.antlr.v4.kotlinruntime.tree.TerminalNode -import kotlin.test.* import kotlin.test.Test as test -import me.tomassetti.minicalc.MiniCalcLexer -import me.tomassetti.minicalc.MiniCalcParser class TestingParser { - @test fun simplestFileUsingHomogeneousAPI() { + @test + fun simplestFileUsingHomogeneousAPI() { val input = ANTLRInputStream("input Int width\n") val lexer = MiniCalcLexer(input) var parser = MiniCalcParser(CommonTokenStream(lexer)) @@ -68,12 +64,12 @@ class TestingParser { val inputDecl = statement.findInputDeclaration()!! val inputKw = inputDecl.INPUT() - assertEquals("input", inputKw.text) + assertEquals("input", inputKw?.text) val type = inputDecl.findType()!! val intKw = (type as MiniCalcParser.IntegerContext).INT() - assertEquals("Int", intKw.text) + assertEquals("Int", intKw?.text) val id = inputDecl.ID()!! assertEquals("width", id.text) From 961955e300e3ceebd39e2993b614fd9438b2135e Mon Sep 17 00:00:00 2001 From: Patrick Del Conte Date: Thu, 26 Apr 2018 23:28:07 +0200 Subject: [PATCH 5/5] put output of antlr in build/generated-src (implicit) fix imports of generated sources --- antlr-kotlin-examples-jvm/build.gradle | 16 +++++++--------- .../src/main/kotlin/UsingLexer.kt | 7 ++----- .../src/main/kotlin/UsingParser.kt | 13 +++++-------- .../src/test/kotlin/MiniCalcParserTest.kt | 4 ++++ 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/antlr-kotlin-examples-jvm/build.gradle b/antlr-kotlin-examples-jvm/build.gradle index 2f3da43..23f0297 100644 --- a/antlr-kotlin-examples-jvm/build.gradle +++ b/antlr-kotlin-examples-jvm/build.gradle @@ -21,28 +21,26 @@ repositories { } dependencies { - compile "com.strumenta.antlr-kotlin:antlr-kotlin-runtime-common:0.0.1" compile "com.strumenta.antlr-kotlin:antlr-kotlin-runtime-jvm:0.0.1" - compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" + testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" - //testCompile 'junit:junit:4.12' + testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } generateKotlinGrammarSource { maxHeapSize = "64m" arguments += ['-package', 'me.tomassetti.minicalc'] - outputDirectory = new File("generated-src/antlr/".toString()) } -compileKotlin.dependsOn generateKotlinGrammarSource + sourceSets { generated { kotlin.srcDir 'generated-src/antlr/' } } -compileKotlin.source sourceSets.generated.kotlin, sourceSets.main.kotlin - -clean{ - delete "generated-src" +compileKotlin { + dependsOn generateKotlinGrammarSource } idea { diff --git a/antlr-kotlin-examples-jvm/src/main/kotlin/UsingLexer.kt b/antlr-kotlin-examples-jvm/src/main/kotlin/UsingLexer.kt index 975e16a..08d9857 100644 --- a/antlr-kotlin-examples-jvm/src/main/kotlin/UsingLexer.kt +++ b/antlr-kotlin-examples-jvm/src/main/kotlin/UsingLexer.kt @@ -1,9 +1,6 @@ - +import me.tomassetti.minicalc.MiniCalcLexer import org.antlr.v4.kotlinruntime.ANTLRInputStream -import org.antlr.v4.kotlinruntime.CharStream import org.antlr.v4.kotlinruntime.Token -import java.lang.RuntimeException -import me.tomassetti.minicalc.MiniCalcLexer fun main(args: Array) { @@ -18,7 +15,7 @@ fun main(args: Array) { val input = ANTLRInputStream("1 + 2") val lexer = MiniCalcLexer(input) - var token : Token? = null + var token: Token? = null do { token = lexer.nextToken() println("TOKEN $token") diff --git a/antlr-kotlin-examples-jvm/src/main/kotlin/UsingParser.kt b/antlr-kotlin-examples-jvm/src/main/kotlin/UsingParser.kt index 238140c..8fccea4 100644 --- a/antlr-kotlin-examples-jvm/src/main/kotlin/UsingParser.kt +++ b/antlr-kotlin-examples-jvm/src/main/kotlin/UsingParser.kt @@ -1,10 +1,7 @@ -import org.antlr.v4.kotlinruntime.ANTLRInputStream -import org.antlr.v4.kotlinruntime.CharStream -import org.antlr.v4.kotlinruntime.CommonTokenStream -import org.antlr.v4.kotlinruntime.Token -import java.lang.RuntimeException import me.tomassetti.minicalc.MiniCalcLexer import me.tomassetti.minicalc.MiniCalcParser +import org.antlr.v4.kotlinruntime.ANTLRInputStream +import org.antlr.v4.kotlinruntime.CommonTokenStream fun main(args: Array) { @@ -22,10 +19,10 @@ fun main(args: Array) { var parser = MiniCalcParser(CommonTokenStream(lexer)) try { val root = parser.miniCalcFile() - println("Parsed: ${root.javaClass}") + println("Parsed: ${root::class}") println("Parsed: ${root.childCount}") - println("Parsed: ${root.children!![0].javaClass}") - } catch (e : Throwable) { + println("Parsed: ${root.children!![0]::class}") + } catch (e: Throwable) { println("Error: $e") } } \ No newline at end of file diff --git a/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt b/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt index 7196fe0..54994f7 100644 --- a/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt +++ b/antlr-kotlin-examples-jvm/src/test/kotlin/MiniCalcParserTest.kt @@ -1,8 +1,12 @@ +import me.tomassetti.minicalc.MiniCalcLexer +import me.tomassetti.minicalc.MiniCalcParser import org.antlr.v4.kotlinruntime.ANTLRInputStream import org.antlr.v4.kotlinruntime.CommonTokenStream import org.antlr.v4.kotlinruntime.ast.Point import org.antlr.v4.kotlinruntime.ast.pos import org.antlr.v4.kotlinruntime.tree.TerminalNode +import kotlin.test.assertEquals +import kotlin.test.assertTrue import kotlin.test.Test as test class TestingParser {