diff --git a/.bazelrc b/.bazelrc index d190fb027..1645b2b57 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1 +1,3 @@ -build --workspace_status_command "./version/org/perses/version/compute_workspace_buildstamp.sh" \ No newline at end of file +build --workspace_status_command "./version/org/perses/version/compute_workspace_buildstamp.sh" +# build --aspects=@rules_rust//rust:defs.bzl%rust_clippy_aspect +build --output_groups=+clippy_checks \ No newline at end of file diff --git a/.gitignore b/.gitignore index 73672b20b..1329e0614 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /bazel* .ijwb +.clwb .idea *.tmp @@ -39,4 +40,4 @@ __pycache__ perses_result* t.c.*.orig -perses-fuzzer \ No newline at end of file +perses-fuzzer diff --git a/BUILD b/BUILD index 2885f0329..6f3bfe420 100644 --- a/BUILD +++ b/BUILD @@ -2,19 +2,8 @@ package( default_visibility = ["//visibility:public"], ) -################################################################################################### -# -# The following is copied from -# https://github.com/bazelbuild/buildtools/tree/master/buildifier -# -################################################################################################### -load("@com_github_bazelbuild_buildtools//buildifier:def.bzl", "buildifier") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "define_kt_toolchain") -buildifier( - name = "buildifier", -) - alias( name = "antlr_tool", actual = "@maven//:org_antlr_antlr4", @@ -26,8 +15,17 @@ alias( ) alias( + name = "jgrapht", + actual = "@maven//:org_jgrapht_jgrapht_core", +) + +java_library( name = "asm", - actual = "@maven//:org_ow2_asm_asm_all", + exports = [ + "@maven//:org_ow2_asm_asm", + "@maven//:org_ow2_asm_asm_commons", + "@maven//:org_ow2_asm_asm_util", + ], ) alias( @@ -67,22 +65,15 @@ java_binary( alias( name = "guava", actual = "@maven//:com_google_guava_guava", - visibility = ["//visibility:public"], ) -java_library( +alias( name = "flogger", - visibility = ["//visibility:public"], - exports = [ - "//src/org/perses/util:flogger_kt_exts", - "@maven//:com_google_flogger_flogger", - "@maven//:com_google_flogger_flogger_system_backend", - ], + actual = "//src/org/perses/util:flogger_kt_exts", ) java_library( name = "jackson", - visibility = ["//visibility:public"], exports = [ "@maven//:com_fasterxml_jackson_core_jackson_annotations", "@maven//:com_fasterxml_jackson_core_jackson_core", @@ -96,21 +87,30 @@ java_library( alias( name = "jcommander", actual = "@maven//:com_beust_jcommander", - visibility = ["//visibility:public"], ) java_library( name = "truth", - visibility = ["//visibility:public"], exports = [ "@maven//:com_google_truth_truth", "@maven//:com_googlecode_java_diff_utils_diffutils", ], ) +java_library( + name = "gumtree", + exports = [ + "@maven//:com_github_gumtreediff_core", + ], +) + define_kt_toolchain( name = "kotlin_toolchain", - api_version = "1.5", + # Can't upgrade to 1.7 because it is still experimental which has limited JSR223 compatibility + # TODO(cnsun): upgrade when JSR is ready and revert back to 1.6 + api_version = "1.6", jvm_target = "1.8", - language_version = "1.5", + language_version = "1.6", ) + +exports_files(["README.md"]) diff --git a/README.md b/README.md index fa3b7084a..5530ac10d 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,22 @@ search space by avoiding generating syntactically invalid programs. Currently, Perses supports reduction for the following programming languages: -+ C -+ Rust -+ Java 8 -+ Go -+ System Verilog - -Support for other languages is comming soon. ++ C: [c] ++ Cpp: [cc, cpp, cxx] ++ Rust: [rs] ++ Scala: [scala, sc] ++ Java: [java] ++ JavaScript: [javascript, js] ++ Python3: [py, py3] ++ Go: [go] ++ PHP: [php] ++ Ruby: [rb] ++ SQLite: [sqlite] ++ Solidity: [sol] ++ System_Verilog: [v, sv] ++ SMTLIBv2: [smt2] + +Support for other languages is coming soon. ### Obtain and Run ### diff --git a/WORKSPACE b/WORKSPACE index 1b8423896..0e82c42a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,8 +1,8 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -RULES_JVM_EXTERNAL_TAG = "2.6" +RULES_JVM_EXTERNAL_TAG = "4.4.2" -RULES_JVM_EXTERNAL_SHA = "064b9085b21c349c8bd8be015a73efd6226dd2ff7d474797b3507ceca29544bb" +RULES_JVM_EXTERNAL_SHA = "735602f50813eb2ea93ca3f5e43b1959bd80b213b836a07a62a29d757670b77b" http_archive( name = "rules_jvm_external", @@ -13,37 +13,47 @@ http_archive( load("@rules_jvm_external//:defs.bzl", "maven_install") +jackson_version = "2.14.2" + +antlr_version = "4.12.0" + +flogger_version = "0.7.4" + maven_install( name = "maven", artifacts = [ - "com.beust:jcommander:1.81", - "com.fasterxml.jackson.core:jackson-core:2.12.3", - "com.fasterxml.jackson.core:jackson-databind:2.12.3", - "com.fasterxml.jackson.core:jackson-annotations:2.12.3", - "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.3", - "com.fasterxml.jackson.datatype:jackson-datatype-guava:2.12.3", - "com.fasterxml.jackson.module:jackson-module-kotlin:2.12.3", + "com.beust:jcommander:1.82", + "com.fasterxml.jackson.core:jackson-core:%s" % jackson_version, + "com.fasterxml.jackson.core:jackson-databind:%s" % jackson_version, + "com.fasterxml.jackson.core:jackson-annotations:%s" % jackson_version, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:%s" % jackson_version, + "com.fasterxml.jackson.datatype:jackson-datatype-guava:%s" % jackson_version, + "com.fasterxml.jackson.module:jackson-module-kotlin:%s" % jackson_version, "com.google.errorprone:error_prone_annotations:2.3.4", - "com.google.flogger:flogger-system-backend:0.5.1", - "com.google.flogger:flogger:0.5.1", - "com.google.googlejavaformat:google-java-format:1.7", - "com.google.guava:guava:30.1-jre", - "com.google.truth:truth:1.1.2", + "com.google.flogger:flogger-system-backend:%s" % flogger_version, + "com.google.flogger:flogger:%s" % flogger_version, + "com.google.googlejavaformat:google-java-format:1.15.0", + "com.google.guava:guava:31.1-jre", + "com.google.truth:truth:1.1.3", "com.googlecode.java-diff-utils:diffutils:1.3.0", - "com.pinterest:ktlint:0.42.1", + "com.guardsquare:proguard-base:7.2.1", + "com.github.gumtreediff:core:3.0.0", + "com.pinterest:ktlint:0.48.2", "io.gitlab.arturbosch.detekt:detekt-cli:1.16.0", "it.unimi.dsi:fastutil:8.5.2", "me.lemire.integercompression:JavaFastPFOR:0.1.9", - "org.antlr:antlr4-runtime:4.9.3", - "org.antlr:antlr4:4.9.3", + "org.antlr:antlr4-runtime:%s" % antlr_version, + "org.antlr:antlr4:%s" % antlr_version, "org.apache.commons:commons-exec:1.3", "org.apache.commons:commons-lang3:3.9", "org.apache.commons:commons-text:1.9", - "org.checkerframework:checker-qual:2.11.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31", + "org.jetbrains.kotlin:kotlin-scripting-jsr223:1.8.20", # Delete this. @TODO(gaosen) + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20", "org.jfree:jfreechart:1.5.0", "org.jgrapht:jgrapht-core:1.3.0", - "org.ow2.asm:asm-all:5.2", + "org.ow2.asm:asm:9.3", + "org.ow2.asm:asm-commons:9.3", + "org.ow2.asm:asm-util:9.3", "junit:junit:4.13.2", # Do not include org.jgrapht:jgrapht-io. It depends on antlr4-runtime:4.7.1 ], @@ -57,9 +67,9 @@ maven_install( load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -rules_kotlin_version = "v1.5.0-beta-4" +rules_kotlin_version = "v1.8-RC-1" -rules_kotlin_sha = "6cbd4e5768bdfae1598662e40272729ec9ece8b7bded8f0d2c81c8ff96dc139d" +rules_kotlin_sha = "1779628569eb3b0fe97a3fb5c3ed8090e6503e425600b401c7b1afb6b23a3098" http_archive( name = "io_bazel_rules_kotlin", @@ -77,6 +87,44 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_register_toolchains") register_toolchains("//:kotlin_toolchain") +################################################################################################### +# Configure rules for rust +################################################################################################### +rust_rules_version = "0.6.0" + +rust_rules_sha256 = "872b04538ca20dad94791c348623f079ba93daf274c1d57ae6bfe0930ec77f0d" + +# To find additional information on this release or newer ones visit: +# https://github.com/bazelbuild/rules_rust/releases +http_archive( + name = "rules_rust", + sha256 = rust_rules_sha256, + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_rust/releases/download/%s/rules_rust-v%s.tar.gz" % (rust_rules_version, rust_rules_version), + "https://github.com/bazelbuild/rules_rust/releases/download/%s/rules_rust-v%s.tar.gz" % (rust_rules_version, rust_rules_version), + ], +) + +load( + "@rules_rust//rust:repositories.bzl", + "rules_rust_dependencies", + "rust_register_toolchains", +) + +rules_rust_dependencies() + +rust_register_toolchains( + edition = "2018", + rustfmt_version = "1.59.0", + version = "1.59.0", +) + +load("@rules_rust//proto:repositories.bzl", "rust_proto_repositories") + +rust_proto_repositories() + +load("@rules_rust//proto:transitive_repositories.bzl", "rust_proto_transitive_repositories") + ################################################################################################### # # The following is copied from @@ -85,12 +133,16 @@ register_toolchains("//:kotlin_toolchain") ################################################################################################### # buildifier is written in Go and hence needs rules_go to be built. # See https://github.com/bazelbuild/rules_go for the up to date setup instructions. +go_rules_version = "0.31.0" + +go_rules_sha = "f2dcd210c7095febe54b804bb1cd3a58fe8435a909db2ec04e31542631cf715c" + http_archive( name = "io_bazel_rules_go", - sha256 = "2b1641428dff9018f9e85c0384f03ec6c10660d935b750e3fa1492a281a53b0f", + sha256 = go_rules_sha, urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.29.0/rules_go-v0.29.0.zip", - "https://github.com/bazelbuild/rules_go/releases/download/v0.29.0/rules_go-v0.29.0.zip", + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v%s/rules_go-v%s.zip" % (go_rules_version, go_rules_version), + "https://github.com/bazelbuild/rules_go/releases/download/v%s/rules_go-v%s.zip" % (go_rules_version, go_rules_version), ], ) @@ -98,14 +150,18 @@ load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_depe go_rules_dependencies() -go_register_toolchains(version = "1.17.1") +go_register_toolchains(version = "1.18.1") + +bazel_gazelle_version = "0.24.0" + +bazel_gazelle_sha = "de69a09dc70417580aabf20a28619bb3ef60d038470c7cf8442fafcf627c21cb" http_archive( name = "bazel_gazelle", - sha256 = "de69a09dc70417580aabf20a28619bb3ef60d038470c7cf8442fafcf627c21cb", + sha256 = bazel_gazelle_sha, urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.24.0/bazel-gazelle-v0.24.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.24.0/bazel-gazelle-v0.24.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v%s/bazel-gazelle-v%s.tar.gz" % (bazel_gazelle_version, bazel_gazelle_version), + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v%s/bazel-gazelle-v%s.tar.gz" % (bazel_gazelle_version, bazel_gazelle_version), ], ) @@ -119,19 +175,25 @@ gazelle_dependencies() # https://github.com/bazelbuild/buildtools/tree/master/buildifier # ################################################################################################### +protobuf_rules_version = "3.20.1" + +protobuf_rules_sha256 = "662879e41508a5ecce3be2c65563a8fac3301a48adef3113913ec4010f405a33" + http_archive( name = "com_google_protobuf", - sha256 = "985bb1ca491f0815daad825ef1857b684e0844dc68123626a08351686e8d30c9", - strip_prefix = "protobuf-3.15.6", - urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.15.6.zip"], + sha256 = protobuf_rules_sha256, + strip_prefix = "protobuf-%s" % protobuf_rules_version, + urls = ["https://github.com/protocolbuffers/protobuf/archive/v%s.zip" % protobuf_rules_version], ) load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") protobuf_deps() +buildtools_version = "5.1.0" + http_archive( name = "com_github_bazelbuild_buildtools", - strip_prefix = "buildtools-4.0.1", - url = "https://github.com/bazelbuild/buildtools/archive/4.0.1.zip", + strip_prefix = "buildtools-%s" % buildtools_version, + url = "https://github.com/bazelbuild/buildtools/archive/%s.zip" % buildtools_version, ) diff --git a/antlropt/src/org/perses/antlr/BUILD b/antlropt/src/org/perses/antlr/BUILD index eaca9c0e9..fbb2997d2 100644 --- a/antlropt/src/org/perses/antlr/BUILD +++ b/antlropt/src/org/perses/antlr/BUILD @@ -8,7 +8,7 @@ kt_jvm_library( "RuleType.kt", ], deps = [ - "//src/org/perses/util:perses_kt_exts", - "@maven//:org_antlr_antlr4", + "//:antlr_tool", + "//src/org/perses/util", ], ) diff --git a/antlropt/src/org/perses/antlr/RuleType.kt b/antlropt/src/org/perses/antlr/RuleType.kt index eae50510f..0c64d4621 100644 --- a/antlropt/src/org/perses/antlr/RuleType.kt +++ b/antlropt/src/org/perses/antlr/RuleType.kt @@ -50,7 +50,7 @@ enum class RuleType(val signaturePrefix: String, val isLexerRule: Boolean) { TOKEN("AUX_TOKEN__", isLexerRule = true), /** The other rules */ - OTHER_RULE("aux_rule__", isLexerRule = false); + OTHER_RULE("aux_rule__", isLexerRule = false), ; val isParserRule: Boolean get() = !isLexerRule diff --git a/antlropt/src/org/perses/antlr/ast/AbstractAstEditor.kt b/antlropt/src/org/perses/antlr/ast/AbstractAstEditor.kt index 6eef4a31b..6f65955f8 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractAstEditor.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractAstEditor.kt @@ -56,7 +56,7 @@ abstract class AbstractAstEditor { fun dispatch( ast: AbstractPersesRuleElement, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return when (ast.tag) { AstTag.RULE_REF -> visit(ast as PersesRuleReferenceAst, newChildren) @@ -81,21 +81,21 @@ abstract class AbstractAstEditor { protected open fun visit( ast: PersesTokenSetAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesTerminalAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesSequenceAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return when (newChildren.size) { 0 -> null @@ -106,56 +106,56 @@ abstract class AbstractAstEditor { protected open fun visit( ast: PersesPlusAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesStarAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesOptionalAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesNotAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesLexerCommandAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesLexerCharSet, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesEpsilonAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesAlternativeBlockAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return when (newChildren.size) { 0 -> null @@ -166,35 +166,35 @@ abstract class AbstractAstEditor { protected open fun visit( ast: PersesActionAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesRuleElementOption, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesRuleReferenceAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesRuleElementLabel, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } protected open fun visit( ast: PersesRangeAst, - newChildren: ImmutableList + newChildren: ImmutableList, ): AbstractPersesRuleElement? { return ast.createWithNewChildren(newChildren) } diff --git a/antlropt/src/org/perses/antlr/ast/AbstractAstVisitor.kt b/antlropt/src/org/perses/antlr/ast/AbstractAstVisitor.kt index fb79a7d08..ff0833b76 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractAstVisitor.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractAstVisitor.kt @@ -32,7 +32,7 @@ abstract class AbstractAstVisitor { } fun preorderGrammar( - rules: Iterable> + rules: Iterable>, ) { for ((_, value) in rules) { preorder(value) diff --git a/antlropt/src/org/perses/antlr/ast/AbstractLexerCommand.kt b/antlropt/src/org/perses/antlr/ast/AbstractLexerCommand.kt index 5c9dbe40e..1fcb9501f 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractLexerCommand.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractLexerCommand.kt @@ -26,7 +26,7 @@ abstract class AbstractLexerCommand protected constructor(protected val commandN class LexerCommandWithArg( commandName: String, - private val arg: String + private val arg: String, ) : AbstractLexerCommand(commandName) { override fun toSourceCode(): String { return "$commandName($arg)" diff --git a/antlropt/src/org/perses/antlr/ast/AbstractPersesEnumAst.kt b/antlropt/src/org/perses/antlr/ast/AbstractPersesEnumAst.kt index a12551626..478323b92 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractPersesEnumAst.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractPersesEnumAst.kt @@ -23,7 +23,7 @@ import java.io.PrintStream abstract class AbstractPersesEnumAst protected constructor( private val enumName: String, - private val values: ImmutableList + private val values: ImmutableList, ) : AbstractPersesAst() { init { diff --git a/antlropt/src/org/perses/antlr/ast/AbstractPersesLexerRuleAst.kt b/antlropt/src/org/perses/antlr/ast/AbstractPersesLexerRuleAst.kt index fe4de836c..5ead52cb5 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractPersesLexerRuleAst.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractPersesLexerRuleAst.kt @@ -21,7 +21,7 @@ import org.perses.antlr.ast.RuleNameRegistry.RuleNameHandle abstract class AbstractPersesLexerRuleAst protected constructor( ruleNameHandle: RuleNameHandle, - body: AbstractPersesRuleElement + body: AbstractPersesRuleElement, ) : AbstractPersesRuleDefAst(ruleNameHandle, body) { init { @@ -29,7 +29,7 @@ abstract class AbstractPersesLexerRuleAst protected constructor( } abstract override fun copyWithNewBody( - newBody: AbstractPersesRuleElement + newBody: AbstractPersesRuleElement, ): AbstractPersesLexerRuleAst override val isLexerRule: Boolean diff --git a/antlropt/src/org/perses/antlr/ast/AbstractPersesQuantifiedAst.kt b/antlropt/src/org/perses/antlr/ast/AbstractPersesQuantifiedAst.kt index 3d7f6bc6c..21cc3d468 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractPersesQuantifiedAst.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractPersesQuantifiedAst.kt @@ -22,7 +22,7 @@ import java.io.PrintStream abstract class AbstractPersesQuantifiedAst( val body: AbstractPersesRuleElement, - val isGreedy: Boolean + val isGreedy: Boolean, ) : AbstractPersesRuleElement() { init { @@ -30,7 +30,7 @@ abstract class AbstractPersesQuantifiedAst( AstTag.EPSILON, AstTag.STAR, AstTag.PLUS, AstTag.OPTIONAL -> error( "Kleene node is disallowed in a quantified node: " + - "${body::class.java}, current=${this::class.java}" + "${body::class.java}, current=${this::class.java}", ) else -> Unit } diff --git a/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleDefAst.kt b/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleDefAst.kt index c281a8df4..eed31fb2d 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleDefAst.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleDefAst.kt @@ -23,7 +23,7 @@ import java.io.PrintStream abstract class AbstractPersesRuleDefAst protected constructor( val ruleNameHandle: RuleNameHandle, - val body: AbstractPersesRuleElement + val body: AbstractPersesRuleElement, ) : AbstractPersesAst() { init { @@ -45,7 +45,7 @@ abstract class AbstractPersesRuleDefAst protected constructor( override fun toSourceCode( stream: PrintStream, indent: Indent, - multiLineMode: Boolean + multiLineMode: Boolean, ) { stream.print(ruleNameHandle.ruleName) afterPrintRuleName(stream) diff --git a/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleElement.kt b/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleElement.kt index 3bbcff934..3a93734a2 100644 --- a/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleElement.kt +++ b/antlropt/src/org/perses/antlr/ast/AbstractPersesRuleElement.kt @@ -31,7 +31,7 @@ abstract class AbstractPersesRuleElement : AbstractPersesAst() { } abstract fun createWithNewChildren( - newChildren: List + newChildren: List, ): AbstractPersesRuleElement fun deepCopyTreeStructure(): AbstractPersesRuleElement { @@ -64,7 +64,7 @@ abstract class AbstractPersesRuleElement : AbstractPersesAst() { // Note that all Perses ASTs should normalize to a single form. for (i in 0 until size) { if (!getChildForEquivalenceChecking(i) - .isEquivalent(other.getChildForEquivalenceChecking(i)) + .isEquivalent(other.getChildForEquivalenceChecking(i)) ) { return false } diff --git a/antlropt/src/org/perses/antlr/ast/AstEdit.kt b/antlropt/src/org/perses/antlr/ast/AstEdit.kt index b14cf3f6f..d484bcf5c 100644 --- a/antlropt/src/org/perses/antlr/ast/AstEdit.kt +++ b/antlropt/src/org/perses/antlr/ast/AstEdit.kt @@ -28,7 +28,7 @@ abstract class AstEdit { private fun apply( ast: AbstractPersesRuleElement, - isRoot: Boolean + isRoot: Boolean, ): NonDeleteTransformDecision { val size = ast.childCount val newChildren = ImmutableList.builder() @@ -50,7 +50,7 @@ abstract class AstEdit { return if (childrenChanged) { TransformDecision.Replace( oldValue = ast, - newValue = internalApplyWithNewChildren(ast, newChildren.build(), isRoot) + newValue = internalApplyWithNewChildren(ast, newChildren.build(), isRoot), ) } else { internalApply(ast, isRoot) @@ -59,13 +59,13 @@ abstract class AstEdit { protected abstract fun internalApply( element: AbstractPersesRuleElement, - isRoot: Boolean + isRoot: Boolean, ): NonDeleteTransformDecision protected open fun internalApplyWithNewChildren( element: AbstractPersesRuleElement, children: ImmutableList, - isRoot: Boolean + isRoot: Boolean, ): AbstractPersesRuleElement { val newElement = SmartAstConstructor.createWithNewChildren(element, children) return when (val decision = internalApply(newElement, isRoot)) { diff --git a/antlropt/src/org/perses/antlr/ast/AstTag.kt b/antlropt/src/org/perses/antlr/ast/AstTag.kt index 160ec512b..b7b61f8af 100644 --- a/antlropt/src/org/perses/antlr/ast/AstTag.kt +++ b/antlropt/src/org/perses/antlr/ast/AstTag.kt @@ -41,7 +41,8 @@ enum class AstTag(val precedence: Precedence) { LEXER_CHAR_SET(Precedence.UNIT), LEXER_RANGE_OPERATOR(Precedence.UNIT), UNKNOWN_TERMINAL_WITH_UNIT_PRECEDENCE(Precedence.UNIT), - EPSILON(Precedence.NONE); + EPSILON(Precedence.NONE), + ; fun isQuantifier(): Boolean { return this == STAR || this == PLUS || this == OPTIONAL diff --git a/antlropt/src/org/perses/antlr/ast/BUILD b/antlropt/src/org/perses/antlr/ast/BUILD index 4c651ee8f..9d0c14f3a 100644 --- a/antlropt/src/org/perses/antlr/ast/BUILD +++ b/antlropt/src/org/perses/antlr/ast/BUILD @@ -54,11 +54,11 @@ kt_jvm_library( "TransformDecision.kt", ], deps = [ + "//:antlr_tool", "//:guava", "//antlropt/src/org/perses/antlr:enum_rule_type", - "//src/org/perses/util:perses_kt_exts", + "//src/org/perses/util", "//src/org/perses/util/ast", - "@maven//:org_antlr_antlr4", ], ) @@ -69,12 +69,12 @@ kt_jvm_library( ], deps = [ ":ast", + "//:antlr_runtime", + "//:antlr_tool", "//:guava", "//antlropt/src/org/perses/antlr:enum_rule_type", "//src/org/perses/antlr:antlr_grammar_parser", - "//src/org/perses/util:perses_kt_exts", - "@maven//:org_antlr_antlr4", - "@maven//:org_antlr_antlr4_runtime", + "//src/org/perses/util", ], ) diff --git a/antlropt/src/org/perses/antlr/ast/EpsilonInfo.kt b/antlropt/src/org/perses/antlr/ast/EpsilonInfo.kt index fdc3409e4..a9922bd16 100644 --- a/antlropt/src/org/perses/antlr/ast/EpsilonInfo.kt +++ b/antlropt/src/org/perses/antlr/ast/EpsilonInfo.kt @@ -20,7 +20,7 @@ import com.google.common.collect.ImmutableSet class EpsilonInfo( val epsilonableRules: ImmutableSet, - private val epsilonableElements: ImmutableSet + private val epsilonableElements: ImmutableSet, ) { fun canBeEpsilon(ruleDef: AbstractPersesRuleDefAst): Boolean { diff --git a/antlropt/src/org/perses/antlr/ast/LexerModeWithLexerRules.kt b/antlropt/src/org/perses/antlr/ast/LexerModeWithLexerRules.kt index b49e9f500..0d9acd409 100644 --- a/antlropt/src/org/perses/antlr/ast/LexerModeWithLexerRules.kt +++ b/antlropt/src/org/perses/antlr/ast/LexerModeWithLexerRules.kt @@ -23,7 +23,7 @@ import java.io.PrintStream /** TODO: test */ class LexerModeWithLexerRules( val modeName: String, - val lexerRules: ImmutableList + val lexerRules: ImmutableList, ) : AbstractPersesAst() { override fun toSourceCode(stream: PrintStream, indent: Indent, multiLineMode: Boolean) { @@ -42,7 +42,7 @@ class LexerModeWithLexerRules( } fun copyWithNewLexerRules( - newLexerRules: ImmutableList + newLexerRules: ImmutableList, ): LexerModeWithLexerRules { return LexerModeWithLexerRules(modeName, newLexerRules) } diff --git a/antlropt/src/org/perses/antlr/ast/LexerRuleList.kt b/antlropt/src/org/perses/antlr/ast/LexerRuleList.kt index 49a7778cf..3992498ce 100644 --- a/antlropt/src/org/perses/antlr/ast/LexerRuleList.kt +++ b/antlropt/src/org/perses/antlr/ast/LexerRuleList.kt @@ -24,7 +24,7 @@ import java.io.PrintStream // TODO: test class LexerRuleList( val defaultModeLexerRules: ImmutableList, - val nonDefaultModes: ImmutableList + val nonDefaultModes: ImmutableList, ) : AbstractPersesAst() { init { diff --git a/antlropt/src/org/perses/antlr/ast/PersesActionAst.kt b/antlropt/src/org/perses/antlr/ast/PersesActionAst.kt index 9dcce51b4..afda4fde6 100644 --- a/antlropt/src/org/perses/antlr/ast/PersesActionAst.kt +++ b/antlropt/src/org/perses/antlr/ast/PersesActionAst.kt @@ -41,7 +41,7 @@ class PersesActionAst(val body: String) : AbstractPersesRuleElement() { get() = AstTag.ACTION override fun createWithNewChildren( - newChildren: List + newChildren: List, ): AbstractPersesRuleElement { return PersesActionAst(body) } diff --git a/antlropt/src/org/perses/antlr/ast/PersesAlternativeBlockAst.kt b/antlropt/src/org/perses/antlr/ast/PersesAlternativeBlockAst.kt index 7f38ad0de..d7974f04e 100644 --- a/antlropt/src/org/perses/antlr/ast/PersesAlternativeBlockAst.kt +++ b/antlropt/src/org/perses/antlr/ast/PersesAlternativeBlockAst.kt @@ -22,7 +22,7 @@ import org.perses.util.toImmutableList import java.io.PrintStream class PersesAlternativeBlockAst( - val alternatives: ImmutableList + val alternatives: ImmutableList, ) : AbstractPersesRuleElement() { private val sortedAlternatives = @@ -72,7 +72,7 @@ class PersesAlternativeBlockAst( override val tag = AstTag.ALTERNATIVE_BLOCK override fun createWithNewChildren( - newChildren: List + newChildren: List, ): AbstractPersesRuleElement { return PersesAlternativeBlockAst(ImmutableList.copyOf(newChildren)) } @@ -99,7 +99,7 @@ class PersesAlternativeBlockAst( for (alt in alternatives) { append(" " + alt.sourceCode).append("\n") } - } + }, ) } require(!prev.isEquivalent(current)) diff --git a/antlropt/src/org/perses/antlr/ast/PersesAstBuilder.kt b/antlropt/src/org/perses/antlr/ast/PersesAstBuilder.kt index ca5faa8e4..5c90f08c2 100644 --- a/antlropt/src/org/perses/antlr/ast/PersesAstBuilder.kt +++ b/antlropt/src/org/perses/antlr/ast/PersesAstBuilder.kt @@ -37,6 +37,8 @@ import org.perses.antlr.AntlrGrammarParser import org.perses.antlr.ast.PersesGrammar.GrammarType import org.perses.antlr.ast.PersesParserRuleAst.ParserRuleAttributes import org.perses.util.toImmutableList +import java.nio.file.Path +import kotlin.io.path.readText class PersesAstBuilder(private val root: GrammarRootAST) { @@ -96,7 +98,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { HashSet().apply { addAll(lexerRuleDefList) addAll(parserRuleDefList) - } == HashSet(rulesDefList) + } == HashSet(rulesDefList), ) } @@ -106,7 +108,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { .asSequence() .map { convertLexerRuleDefinition(it, symbolTable) } .toImmutableList(), - persesLexerModeAsts + persesLexerModeAsts, ) private val persesParserRuleDefs = parserRuleDefList @@ -123,7 +125,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { namedActions, persesLexerRuleDefs, persesParserRuleDefs, - symbolTable + symbolTable, ) init { @@ -133,7 +135,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { } private fun convertLexerModes( - modes: ImmutableList + modes: ImmutableList, ): ImmutableList { val result = ImmutableList.builder() for (modeAst in modes) { @@ -237,6 +239,12 @@ class PersesAstBuilder(private val root: GrammarRootAST) { } companion object { + + @JvmStatic + fun loadGrammarFromFile(file: Path): PersesGrammar { + return loadGrammarFromString(file.readText()) + } + @JvmStatic fun loadGrammarFromString(grammarContent: String): PersesGrammar { return PersesAstBuilder(AntlrGrammarParser.parseRawGrammarASTFromString(grammarContent)) @@ -252,8 +260,9 @@ class PersesAstBuilder(private val root: GrammarRootAST) { check(child.childCount == 2) builder.add( PersesGrammarOptionsAst.Option( - child.getChild(0).text, child.getChild(1).text - ) + child.getChild(0).text, + child.getChild(1).text, + ), ) } return PersesGrammarOptionsAst(builder.build()) @@ -371,7 +380,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { private fun convertParserRuleDefinition( parserRuleAST: RuleAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): PersesParserRuleAst { check(!parserRuleAST.isLexerRule) @@ -394,7 +403,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { private fun convertLexerRuleDefinition( lexerRuleAST: RuleAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): AbstractPersesLexerRuleAst { check(lexerRuleAST.isLexerRule) @@ -437,7 +446,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { lexerCommandName == "channel" || lexerCommandName == "pushMode" || lexerCommandName == "mode" || - lexerCommandName == "type" + lexerCommandName == "type", ) val commandArg = it.getChild(1).text AbstractLexerCommand.create(lexerCommandName, commandArg) @@ -465,7 +474,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { private fun convertAlternativeBlock( block: BlockAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): AbstractPersesRuleElement { val childNodeClasses = collectChildNodeClasses(block) require(childNodeClasses.size == 1) { childNodeClasses } @@ -496,7 +505,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { private fun convertSingleAlternative( ast: AltAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): AbstractPersesRuleElement { val astTokenType = ast.getToken().type require(astTokenType == ANTLRParser.LEXER_ALT_ACTION || astTokenType == ANTLRParser.ALT) @@ -505,7 +514,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { require(ast.childCount == 2) val child = ast.getChild(0) as GrammarAST check( - child is AltAST && child.getToken().type == ANTLRParser.ALT + child is AltAST && child.getToken().type == ANTLRParser.ALT, ) child } else { @@ -522,7 +531,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { @JvmStatic fun combineIntoSequence( - children: List + children: List, ): AbstractPersesRuleElement { if (children.size == 1) { return children[0] @@ -547,7 +556,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { @VisibleForTesting fun convertRuleRefAst( ruleRefAst: RuleRefAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): PersesRuleReferenceAst { val ruleNameHandle = symbolTable.ruleNameRegistry.getOrCreate(ruleRefAst.getToken().text) val arguments: PersesActionAst? @@ -563,7 +572,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { fun convertOptionalBlockAst( ast: OptionalBlockAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): PersesOptionalAst { val body = checkAndConvertBodyOfQuantifiedBlock(ast, symbolTable) return if (ast.isGreedy) { @@ -593,7 +602,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { private fun checkAndConvertBodyOfQuantifiedBlock( ast: GrammarAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): AbstractPersesRuleElement { require(ast.childCount == 1) require(ast.getChild(0) is BlockAST) @@ -657,7 +666,7 @@ class PersesAstBuilder(private val root: GrammarRootAST) { private fun convertRuleElementLabel( ast: GrammarAST, - symbolTable: SymbolTable + symbolTable: SymbolTable, ): PersesRuleElementLabel { require(PersesRuleElementLabel.isRuleElementLabel(ast)) val operator = ast.getToken().text @@ -700,7 +709,8 @@ class PersesAstBuilder(private val root: GrammarRootAST) { check(first is TerminalAST) check(second is TerminalAST) return PersesRangeAst( - convertTerminalAst(first), convertTerminalAst(second) + convertTerminalAst(first), + convertTerminalAst(second), ) } diff --git a/antlropt/src/org/perses/antlr/ast/PersesEpsilonAst.kt b/antlropt/src/org/perses/antlr/ast/PersesEpsilonAst.kt index ac4b3b73c..5eb60ff31 100644 --- a/antlropt/src/org/perses/antlr/ast/PersesEpsilonAst.kt +++ b/antlropt/src/org/perses/antlr/ast/PersesEpsilonAst.kt @@ -43,7 +43,7 @@ class PersesEpsilonAst() : AbstractPersesRuleElement() { } override fun createWithNewChildren( - newChildren: List + newChildren: List, ): AbstractPersesRuleElement { require(newChildren.isEmpty()) return PersesEpsilonAst() diff --git a/antlropt/src/org/perses/antlr/ast/PersesFragmentLexerRuleAst.kt b/antlropt/src/org/perses/antlr/ast/PersesFragmentLexerRuleAst.kt index fa75732e6..9161128a5 100644 --- a/antlropt/src/org/perses/antlr/ast/PersesFragmentLexerRuleAst.kt +++ b/antlropt/src/org/perses/antlr/ast/PersesFragmentLexerRuleAst.kt @@ -21,7 +21,7 @@ import java.io.PrintStream class PersesFragmentLexerRuleAst( ruleNameHandle: RuleNameRegistry.RuleNameHandle, - body: AbstractPersesRuleElement + body: AbstractPersesRuleElement, ) : AbstractPersesLexerRuleAst(ruleNameHandle, body) { override fun copyWithNewBody(newBody: AbstractPersesRuleElement): PersesFragmentLexerRuleAst { diff --git a/antlropt/src/org/perses/antlr/ast/PersesGrammar.kt b/antlropt/src/org/perses/antlr/ast/PersesGrammar.kt index c4be31e7a..872fad68d 100644 --- a/antlropt/src/org/perses/antlr/ast/PersesGrammar.kt +++ b/antlropt/src/org/perses/antlr/ast/PersesGrammar.kt @@ -33,7 +33,7 @@ class PersesGrammar( val namedActions: ImmutableList, val lexerRules: LexerRuleList, val parserRules: ImmutableList, - val symbolTable: SymbolTable + val symbolTable: SymbolTable, ) : AbstractPersesAst() { enum class GrammarType { @@ -76,7 +76,7 @@ class PersesGrammar( .asSequence() .toImmutableMap( keyFunc = { it.ruleNameHandle }, - valueFunc = { it } + valueFunc = { it }, ) fun getRuleNameHandleOrThrow(ruleName: String): RuleNameHandle { @@ -93,12 +93,12 @@ class PersesGrammar( namedActions, lexerRules, parserRules, - symbolTable + symbolTable, ) } fun copyWithNewLexerRuleDefs( - newLexerRules: LexerRuleList + newLexerRules: LexerRuleList, ): PersesGrammar { return PersesGrammar( grammarType, @@ -109,12 +109,12 @@ class PersesGrammar( namedActions, newLexerRules, parserRules, - symbolTable + symbolTable, ) } fun copyWithNewParserRuleDefs( - newParserRules: ImmutableList + newParserRules: ImmutableList, ): PersesGrammar { return PersesGrammar( grammarType, @@ -125,7 +125,7 @@ class PersesGrammar( namedActions, lexerRules, newParserRules, - symbolTable + symbolTable, ) } @@ -149,7 +149,7 @@ class PersesGrammar( namedActions, lexerRules, newParserRules, - symbolTable + symbolTable, ) } @@ -179,10 +179,8 @@ class PersesGrammar( for (action in namedActions) { action.toSourceCode(stream, emptyIndent, SINGLE_LINE_MODE) } - for (lexerRule in lexerRules.defaultModeLexerRules) { - lexerRule.toSourceCode(stream, emptyIndent, MULTI_LINE_MODE) - stream.print('\n') - } + lexerRules.toSourceCode(stream, emptyIndent, MULTI_LINE_MODE) + stream.println("\n") for (rule in parserRules) { rule.toSourceCode(stream, emptyIndent, MULTI_LINE_MODE) stream.print('\n') @@ -207,8 +205,8 @@ class PersesGrammar( } for (ruleNameHandle in ruleNameToRuleMap.keys) { if (!ruleNameToRuleMap[ruleNameHandle]!! - .body - .isEquivalent(other.ruleNameToRuleMap[ruleNameHandle]!!.body) + .body + .isEquivalent(other.ruleNameToRuleMap[ruleNameHandle]!!.body) ) { return false } diff --git a/antlropt/src/org/perses/antlr/ast/PersesGrammarOptionsAst.kt b/antlropt/src/org/perses/antlr/ast/PersesGrammarOptionsAst.kt index 16ce9c5b5..5a0a7eb38 100644 --- a/antlropt/src/org/perses/antlr/ast/PersesGrammarOptionsAst.kt +++ b/antlropt/src/org/perses/antlr/ast/PersesGrammarOptionsAst.kt @@ -21,7 +21,7 @@ import org.perses.util.ast.Indent import java.io.PrintStream class PersesGrammarOptionsAst( - private val options: ImmutableList