moving files to 'primary' or 'synthesized'
authorThomas Walker Lynch <xtujpz@reasoningtechnology.com>
Tue, 10 Sep 2024 11:11:32 +0000 (11:11 +0000)
committerThomas Walker Lynch <xtujpz@reasoningtechnology.com>
Tue, 10 Sep 2024 11:11:32 +0000 (11:11 +0000)
54 files changed:
developer/deprecated/Hibou_build.gradle [new file with mode: 0644]
developer/deprecated/build.gradle [new file with mode: 0644]
developer/deprecated/make
developer/deprecated/makefile-project.mk
developer/deprecated/makefile-tool.mk
developer/deprecated/makefile-top.mk
developer/executor/ANTLR_OUT_FL
developer/executor/build.gradle [new file with mode: 0644]
developer/executor/env_build
developer/executor/gradle [new file with mode: 0755]
developer/executor/make [deleted file]
developer/executor/makefile-project.mk [deleted file]
developer/executor/makefile-tool.mk [deleted file]
developer/executor/makefile-top.mk [deleted file]
developer/javac/ANTLR_OUT_FL.java [deleted file]
developer/javac/Arithmetic2_SyntaxAnnotate.java [deleted file]
developer/javac/Arithmetic2_SyntaxAnnotate_PrintVisitor.java [deleted file]
developer/javac/Arithmetic_Echo.java [deleted file]
developer/javac/Arithmetic_Echo_PrintVisitor.java [deleted file]
developer/javac/Arithmetic_Echo__Test.java [deleted file]
developer/javac/Arithmetic_SyntaxAnnotate.java [deleted file]
developer/javac/Arithmetic_SyntaxAnnotate_PrintVisitor.java [deleted file]
developer/javac/Arithmetic_SyntaxAnnotate__Test.java [deleted file]
developer/javac/RuleNameList.java [deleted file]
developer/javac/RuleNameListRegx.java [deleted file]
developer/javac/StringUtils.java [deleted file]
developer/javac/Synthesize_SyntaxAnnotate.java [deleted file]
developer/javac/Synthesize_SyntaxAnnotate_PrintVisitor.java [deleted file]
developer/javac/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java [deleted file]
developer/javac/TestBench.java [deleted file]
developer/javac/primary/ANTLR_OUT_FL.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_Echo.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_Echo_PrintVisitor.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_Echo__Test.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_Swap.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_SwapVisitor.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_SyntaxAnnotate.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_SyntaxAnnotate_PrintVisitor.java [new file with mode: 0644]
developer/javac/primary/Arithmetic_SyntaxAnnotate__Test.java [new file with mode: 0644]
developer/javac/primary/RuleNameList.java [new file with mode: 0644]
developer/javac/primary/RuleNameListRegx.java [new file with mode: 0644]
developer/javac/primary/StringUtils.java [new file with mode: 0644]
developer/javac/primary/Synthesize_SyntaxAnnotate.java [new file with mode: 0644]
developer/javac/primary/Synthesize_SyntaxAnnotate_PrintVisitor.java [new file with mode: 0644]
developer/javac/primary/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java [new file with mode: 0644]
developer/javac/primary/TestBench.java [new file with mode: 0644]
developer/javac/synthesized/Arithmetic2_SyntaxAnnotate.java [new file with mode: 0644]
developer/javac/synthesized/Arithmetic2_SyntaxAnnotate_PrintVisitor.java [new file with mode: 0644]
developer/ologist/#emacs.txt# [new file with mode: 0644]
developer/ologist/emacs.txt
executor/env_dev
executor/install
ologist/directory_structure.md
settings.gradle [new file with mode: 0644]

diff --git a/developer/deprecated/Hibou_build.gradle b/developer/deprecated/Hibou_build.gradle
new file mode 100644 (file)
index 0000000..ca38ddd
--- /dev/null
@@ -0,0 +1,106 @@
+task setup {
+  doLast {
+    def dirs = [
+      "$(ANTLR_IN_PRIMARY_DIR)",
+      "$(JAVA_COMP_IN_DIR)",
+      "$(JAVA_COMP_IN_PRIMARY_DIR)",
+      "$(JAVA_COMP_IN_ANTLR_DIR)",
+      "$(JAVA_COMP_IN_SYN_DIR)",
+      "$(JVM_IN_DIR)",
+      "$(EXECUTOR_IN_DIR)",
+      "test",
+      "deprecated",
+      "experiment",
+      "ologist",
+      "temporary"
+    ]
+    dirs.each { dir ->
+      if (!file(dir).exists()) {
+        mkdir dir
+      }
+    }
+  }
+}
+
+def compileJava(source, target) {
+  tasks.create(name: "compile${source}", type: Exec) {
+    commandLine '$(JAVA_COMP)', '-d', '$(JAVA_COMP_OUT_DIR)', '-sourcepath', '$(JAVA_COMP_IN_DL)', source
+    doLast {
+      println "Compiled ${source} to ${target}"
+    }
+  }
+}
+
+def createJar(source, target) {
+  tasks.create(name: "jar${source}", type: Exec) {
+    commandLine '$(JAVA_ARCHIVE)', 'cf', target, '-C', '$(JAVA_COMP_OUT_DIR)', source
+    doLast {
+      println "Created ${target}"
+    }
+  }
+}
+
+def createWrapper(source, target) {
+  tasks.create(name: "wrapper${source}", type: Exec) {
+    doLast {
+      def script = new File(target)
+      script.text = "#!/usr/bin/env bash\n$(JAVA_INTERP) -cp ${CLASSPATH}:${JVM_IN_DP}:${JVM_IN_DP}/${source}.jar ${source} \$@"
+      script.setExecutable(true)
+      println "Created program ${target}"
+    }
+  }
+}
+
+task ANTLR_OUT_FL {
+  dependsOn setup
+  doLast {
+    println "Building ANTLR_OUT_FL..."
+    // Add specific build steps for ANTLR_OUT_FL here
+  }
+}
+
+task all {
+  dependsOn ANTLR_OUT_FL
+  doLast {
+    println "Building all targets..."
+  }
+}
+
+task clean {
+  doLast {
+    println "Use the command `clean <option>` instead of make."
+  }
+}
+
+task version {
+  doLast {
+    println "ANTLR_JAR is '${notdir(ANTLR_JAR)}'"
+    exec {
+      commandLine '$(JAVA_COMP)', '--version'
+    }
+    exec {
+      commandLine '$(JAVA_ARCHIVE)', '--version'
+    }
+    exec {
+      commandLine 'make', '-v'
+    }
+    println "makefile 0.4"
+  }
+}
+
+task nothing {
+  doLast {
+    // useful for distinguishing between make syntax errors and build errors
+  }
+}
+
+tasks.withType(Exec) {
+  doFirst {
+    println "Executing $name"
+  }
+}
+
+// Example usage
+compileJava('$(JAVA_COMP_IN_PRIMARY_DIR)/Example.java', '$(JAVA_COMP_OUT_DIR)/Example.class')
+createJar('Example.class', '$(JAVA_COMP_OUT_DIR)/Example.jar')
+createWrapper('Example', '$(EXECUTOR_IN_DIR)/Example')
diff --git a/developer/deprecated/build.gradle b/developer/deprecated/build.gradle
new file mode 100644 (file)
index 0000000..b5ab4a6
--- /dev/null
@@ -0,0 +1,91 @@
+task setup {
+  doLast {
+    def dirs = ["$(ANTLR_IN_PRIMARY_DIR)", "$(JAVA_COMP_IN_PRIMARY_DIR)", "$(JVM_IN_DIR)", "$(EXECUTOR_IN_DIR)", "test", "deprecated", "experiment", "ologist", "temporary"]
+    dirs.each { dir ->
+      mkdir dir
+    }
+  }
+}
+
+task tool(type: Exec) {
+  dependsOn setup
+  commandLine '$(BIN_MAKE)', '-f', '$(EXECUTOR_IN_DIR)/makefile-tool.mk', '-$(MAKEFLAGS)', 'all'
+}
+
+task project(type: Exec) {
+  dependsOn tool
+  commandLine '$(BIN_MAKE)', '-f', '$(EXECUTOR_IN_DIR)/makefile-project.mk', '-$(MAKEFLAGS)', 'all'
+}
+
+task clean {
+  doLast {
+    println "Use the command `clean <option>` instead of make."
+  }
+}
+
+task version {
+  doLast {
+    println "ANTLR_JAR is '${notdir(ANTLR_JAR)}'"
+    exec {
+      commandLine '$(JAVA_COMP)', '--version'
+    }
+    exec {
+      commandLine '$(JAVA_ARCHIVE)', '--version'
+    }
+    exec {
+      commandLine 'make', '-v'
+    }
+    println "makefile 0.4"
+  }
+}
+
+task all {
+  dependsOn project
+}
+
+task nothing {
+  doLast {
+    // useful for distinguishing between make syntax errors and build errors
+  }
+}
+
+tasks.withType(Exec) {
+  doFirst {
+    println "Executing $name"
+  }
+}
+
+
+----------------------
+// Function to compile .java files to .class files
+def compileJava(source, target) {
+  tasks.create(name: "compile${source}", type: Exec) {
+    commandLine '$(JAVA_COMP)', '-d', '$(JAVA_COMP_OUT_DIR)', '-sourcepath', '$(JAVA_COMP_IN_DL)', source
+    doLast {
+      println "Compiled ${source} to ${target}"
+    }
+  }
+}
+
+// Function to create .jar files from .class files
+def createJar(source, target) {
+  tasks.create(name: "jar${source}", type: Exec) {
+    commandLine '$(JAVA_ARCHIVE)', 'cf', target, '-C', '$(JAVA_COMP_OUT_DIR)', source
+    doLast {
+      println "Created ${target}"
+    }
+  }
+}
+
+// Function to create wrapper scripts from .jar files
+def createWrapper(source, target) {
+  tasks.create(name: "wrapper${source}", type: Exec) {
+    doLast {
+      def script = new File(target)
+      script.text = "#!/usr/bin/env bash\n$(JAVA_INTERP) -cp ${CLASSPATH}:${JVM_IN_DP}:${JVM_IN_DP}/${source}.jar ${source} \$@"
+      script.setExecutable(true)
+      println "Created program ${target}"
+    }
+  }
+}
+  
index a556a0f..714a070 100755 (executable)
@@ -12,4 +12,4 @@ cd "$DEVELOPER_HOME"
 # in case there have been edits to the environment
 source "${EXECUTOR_IN_DIR}"/env_build
 
-${BIN_MAKE} --no-builtin-rules -f "${EXECUTOR_IN_DIR}"/makefile-top.mk $@
+${BIN_MAKE} --no-print-directory -f "${EXECUTOR_IN_DIR}"/makefile-top.mk $@
index ea61056..ea8a0f3 100644 (file)
+#--------------------------------------------------------------------------------
+# Project build
+#
+# GNU makefile
+
+# turn off implicit rules, because they can do unexpected things.
+.SUFFIXES:
+MAKEFLAGS += -r
+
+# `make` considers that PHONY targets do not correspond to files (other
+# targets do and the files have their dates checked). This declaration renders
+# innocuous the "feature" where `make` always tries to make its own
+# makefiles. There is no command line switch to turn this "feature" off.
+.PHONY: $(MAKEFILE_LIST)
+
+# 'make' has a "feature" where it deletes what it determines to be intermediate
+# files. There is no command line switch to turn this "feature" off. Combine
+# this "feature" with implicit rules and have loads of fun.
+.PRECIOUS: $(MAKEFILE_LIST)
+
+#$(info makefile: $(MAKEFILE_LIST))
+#$(info project_MAKECMDGOALS: $(MAKECMDGOALS))
+
+# for recursive make without leaving this makefile
+REMAKE = $(MAKE) -$(MAKEFLAGS) -f $(MAKEFILE_LIST)
+
 #================================================================================
 # Custom make targets
 #
-$(info project_MAKECMDGOALS: $(MAKECMDGOALS))
 
 all: $(EXECUTOR_IN_FPL)
 
-PrintRuleNameList: $(EXECUTOR_IN_DIR)/PrintRuleNameList
 
+#-----------------------------------------------
+# These do not require antlr generated java files
+
+RuleNameListRegx: $(EXECUTOR_IN_DIR)/RuleNameListRegx
+RuleNameList: $(EXECUTOR_IN_DIR)/RuleNameList
+
+Synthesize_SyntaxAnnotate_PrintVisitorMethod:\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/StringUtils.java\
+  $(EXECUTOR_IN_DIR)/Synthesize_SyntaxAnnotate_PrintVisitorMethod
+Synthesize_SyntaxAnnotate_PrintVisitor:\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/StringUtils.java\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java\
+  $(EXECUTOR_IN_DIR)/Synthesize_SyntaxAnnotate_PrintVisitor
+
+Synthesize_SyntaxAnnotate:\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/StringUtils.java\
+  $(EXECUTOR_IN_DIR)/Synthesize_SyntaxAnnotate
 
 #-----------------------------------------------
 # Arithmetic
 
-ANTLR_OUT_Arithmetic_FL := $(shell ANTLR_OUT_FL Arithmetic.g4 -visitor -no-listener -no-tokens)
-ANTLR_OUT_Arithmetic_FPL := $(addprefix $(ANTLR_OUT_DIR)/, $(ANTLR_OUT_Arithmetic_FL))
-Arithmetic_Echo: $(ANTLR_OUT_Arithmetic_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Echo_PrintVisitor.java
+ANTLR_OUT_Arithmetic_FPL:= $(shell ANTLR_OUT_FL Arithmetic -path $(ANTLR_OUT_DIR))
+#$(info ANTLR_OUT_Arithmetic_FPL: $(ANTLR_OUT_Arithmetic_FPL))
+Arithmetic_Echo:\
+  $(ANTLR_OUT_Arithmetic_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Echo_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
+         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
+         exit 1; \
+       fi
+       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Echo
+
+Arithmetic_Echo__Test:\
+  $(ANTLR_OUT_Arithmetic_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Echo_PrintVisitor.java
        @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
          echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
          exit 1; \
        fi
-       $(BIN_MAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Echo
-
-# Arithmetic_Echo__Test: $(ANTLR_OUT_Arithmetic_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Echo_PrintVisitor.java
-#      @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-#        echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-#        exit 1; \
-#      fi
-#      $(BIN_MAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Echo__Test
-
-# Arithmetic_Syntax: $(ANTLR_OUT_Arithmetic_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Syntax_PrintVisitor.java
-#      @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-#        echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-#        exit 1; \
-#      fi
-#      $(BIN_MAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Syntax
-
-# Arithmetic_Syntax__Test: $(ANTLR_OUT_Arithmetic_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Syntax_PrintVisitor.java
-#      @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-#        echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-#        exit 1; \
-#      fi
-#      $(BIN_MAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Syntax__Test
+       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Echo__Test
+
+Arithmetic_SyntaxAnnotate:\
+  $(ANTLR_OUT_Arithmetic_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_SyntaxAnnotate_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
+         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
+         exit 1; \
+       fi
+       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_SyntaxAnnotate
+
+Arithmetic_SyntaxAnnotate__Test:\
+  $(ANTLR_OUT_Arithmetic_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_SyntaxAnnotate_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
+         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
+         exit 1; \
+       fi
+       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_SyntaxAnnotate__Test
+
+Arithmetic_Swap:\
+  $(ANTLR_OUT_Arithmetic_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_SwapVisitor.java\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Echo_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
+         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
+         exit 1; \
+       fi
+       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Swap
 
 #-----------------------------------------------
-#  GQL_20240412
+# Arithmetic2
+# 
+
+ANTLR_OUT_Arithmetic2_FPL:= $(shell ANTLR_OUT_FL Arithmetic2 -path $(ANTLR_OUT_DIR))
+Arithmetic2_SyntaxAnnotate:\
+  $(ANTLR_OUT_Arithmetic2_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic2_SyntaxAnnotate_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_Arithmetic2_FPL)" ]; then \
+         echo "variable ANTLR_OUT_Arithmetic2_FPL empty."; \
+         exit 1; \
+       fi
+       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic2_SyntaxAnnotate
+
+Arithmetic2_SyntaxAnnotate__Test:\
+  $(ANTLR_OUT_Arithmetic2_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic2_SyntaxAnnotate_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_Arithmetic2_FPL)" ]; then \
+         echo "variable ANTLR_OUT_Arithmetic2_FPL empty."; \
+         exit 1; \
+       fi
+       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic2_SyntaxAnnotate__Test
+
+#-----------------------------------------------
+# Parsing/Analyzing ANTLR grammars
+#
+
+ANTLR_OUT_ANTLRv4_FPL:= $(shell ANTLR_OUT_FL ANTLRv4 -path $(ANTLR_OUT_DIR))
+ANTLRv4_SyntaxAnnotate:\
+  $(ANTLR_OUT_ANTLRv4_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/ANTLRv4_SyntaxAnnotate_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_ANTLRv4_FPL)" ]; then \
+         echo "variable ANTLR_OUT_ANTLRv4_FPL empty."; \
+         exit 1; \
+       fi
+       $(REMAKE) $(EXECUTOR_IN_DIR)/ANTLRv4_SyntaxAnnotate
 
-ANTLR_OUT_GQL_20240412_FL := $(shell ANTLR_OUT_FL GQL_20240412.g4 -visitor -no-listener -no-tokens)
-ANTLR_OUT_GQL_20240412_FPL := $(addprefix $(ANTLR_OUT_DIR)/, $(ANTLR_OUT_GQL_20240412_FL))
 
-GQL_20240412_Syntax: $(ANTLR_OUT_GQL_20240412_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_Syntax_PrintVisitor.java
+#-----------------------------------------------
+#  GQL_20240412
+
+ANTLR_OUT_GQL_20240412_FPL := $(shell ANTLR_OUT_FL GQL_20240412 -path $(ANTLR_OUT_DIR))
+GQL_20240412_SyntaxAnnotate:\
+  $(ANTLR_OUT_GQL_20240412_FPL)\
+  $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_SyntaxAnnotate_PrintVisitor.java
        @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
          echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
          exit 1; \
        fi
-       $(BIN_MAKE) $(EXECUTOR_IN_DIR)/GQL_20240412_Syntax
+       $(REMAKE) $(EXECUTOR_IN_DIR)/GQL_20240412_SyntaxAnnotate
 
-GQL_20240412_Syntax__Test: $(ANTLR_OUT_GQL_20240412_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_Syntax_PrintVisitor.java
+GQL_20240412_SyntaxAnnotate__Test: \
+  $(ANTLR_OUT_GQL_20240412_FPL) \
+  $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_SyntaxAnnotate_PrintVisitor.java
        @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
          echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
          exit 1; \
        fi
-       $(BIN_MAKE) $(EXECUTOR_IN_DIR)/GQL_20240412_Syntax__Test
+       $(REMAKE) $(EXECUTOR_IN_DIR)/GQL_20240412_SyntaxAnnotate__Test
+
 
 TerminalToCategory: 
-       $(BIN_MAKE) $(EXECUTOR_IN_DIR)/TerminalToCategory
+       $(REMAKE) $(EXECUTOR_IN_DIR)/TerminalToCategory
 
 GrammarSplitter: 
-       $(BIN_MAKE) $(EXECUTOR_IN_DIR)/GrammarSplitter
+       $(REMAKE) $(EXECUTOR_IN_DIR)/GrammarSplitter
 
 #-----------------------------------------------
 # Compile all the .java files.
 
 java: $(JAVA_COMP_OUT_FPL)
 
-#-----------------------------------------------
-# Clean is program, not a target
-
-# Default clean target
-.PHONY: clean
-clean:
-       @echo "Use the clean script from the $(EXECUTOR_IN_DIR) directory instead of \`make clean\`"
-       @$(EXECUTOR_IN_DIR)/clean
-
-#-----------------------------------------------
-# useful for distinguishing between initial make error messages and message
-# generated by rules firing
-
-nothing:
-       @:
 
 #================================================================================
 # generic targets, aka recipes
 #
 
+# this section is not parallel make friendly
+# $(ANTLR_OUT_DIR)/%Lexer.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
+#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
+# $(ANTLR_OUT_DIR)/%Parser.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
+#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
+# $(ANTLR_OUT_DIR)/%BaseListener.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
+#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
+# $(ANTLR_OUT_DIR)/%Listener.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
+#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
+# $(ANTLR_OUT_DIR)/%BaseVisitor.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
+#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
+# $(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
+#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
+
+#--------------------
+# for a single `<name>.g4` grammar file
+
 $(ANTLR_OUT_DIR)/%Lexer.java \
-$(ANTLR_OUT_DIR)/%Lexer.tokens \
 $(ANTLR_OUT_DIR)/%Parser.java \
-$(ANTLR_OUT_DIR)/%Parser.tokens \
 $(ANTLR_OUT_DIR)/%BaseListener.java \
 $(ANTLR_OUT_DIR)/%Listener.java \
 $(ANTLR_OUT_DIR)/%BaseVisitor.java \
-$(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_FPL)
-       @echo "making grammar from:" $<
+$(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
+       @echo "copiling grammar from:" $<
+       $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
+
+#--------------------
+# For separate `<mame>Lexer.g4` and `<name>Parser.g4` files.
+# `make` prefers shorter pattern matches, so this should work.
+#
+
+$(ANTLR_OUT_DIR)/LexerAdaptor.java: $(ANTLR_IN_PRIMARY_DIR)/LexerAdaptor.java
+       cp $(ANTLR_IN_PRIMARY_DIR)/LexerAdaptor.java $(ANTLR_OUT_DIR)
+
+$(ANTLR_OUT_DIR)/%Lexer.java: $(ANTLR_IN_PRIMARY_DIR)/%Lexer.g4 $(ANTLR_OUT_DIR)/LexerAdaptor.java
+       @echo "making lexer grammar from:" $<
        $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
 
-# Rule to build .class files from .java files
+# Rule for all generated files from Parser.g4
+$(ANTLR_OUT_DIR)/%Parser.java \
+$(ANTLR_OUT_DIR)/%BaseListener.java \
+$(ANTLR_OUT_DIR)/%Listener.java \
+$(ANTLR_OUT_DIR)/%BaseVisitor.java \
+$(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_DIR)/%Parser.g4
+       @echo "making other grammar files from:" $<
+       $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -lib $(ANTLR_OUT_DIR) -o $(ANTLR_OUT_DIR_PARENT) $<
+
+#---------------------
+
+# make .class file from .java file
 $(JAVA_COMP_OUT_DIR)/%.class: $(JAVA_COMP_IN_PRIMARY_DIR)/%.java
        @echo "Compiling $<..."
        $(JAVA_COMP) -d $(JAVA_COMP_OUT_DIR) -sourcepath $(JAVA_COMP_IN_DL) $<
        @echo "Created $@"
 
-# Without this, GNU make inserts an 'rm -rf' not on the recipe and deletes the .jar files
-# after making them.  Why make why?
+# Without this, `make` sees .jar files as intermediate and deletes them.
 .PRECIOUS: $(JAVA_COMP_OUT_DIR)/%.jar
-# Rule to build .jar files from .class files
+
+# make .jar from .class file
 $(JAVA_COMP_OUT_DIR)/%.jar: $(JAVA_COMP_OUT_DIR)/%.class
        @echo "Building $*..."
        $(JAVA_ARCHIVE) cf $@ -C $(JAVA_COMP_OUT_DIR) $*.class
        @echo "Created $@"
 
+#make the wrapper script from the .jar file
 $(EXECUTOR_IN_DIR)/%: $(JVM_IN_DIR)/%.jar
-       @echo "Creating script for $*..."
+       @echo "Creating program for $*..."
        @echo "#!/usr/bin/env bash" > $(EXECUTOR_IN_DIR)/$*
        @echo "$(JAVA_INTERP) -cp ${CLASSPATH}:${JVM_IN_DP}:$(JVM_IN_DP)/$*.jar $*" \$$\@ >> $(EXECUTOR_IN_DIR)/$*
        chmod +x $(EXECUTOR_IN_DIR)/$*
-       @echo "Created script $(EXECUTOR_IN_DIR)/$*"
+       @echo "Created program $(EXECUTOR_IN_DIR)/$*"
index 4ee0f48..e43278b 100644 (file)
@@ -1,35 +1,61 @@
+#================================================================================
+# Build the tools that are needed for building the project.
+#
+# GNU makefile
+
+# turn off implicit rules, because they can do unexpected things.
+.SUFFIXES:
+MAKEFLAGS += -r
+
+# `make` considers that PHONY targets do not correspond to files (other
+# targets do and the files have their dates checked). This declaration renders
+# innocuous the "feature" where `make` always tries to make its own
+# makefiles. There is no command line switch to turn this "feature" off.
+.PHONY: $(MAKEFILE_LIST)
+
+# 'make' has a "feature" where it deletes what it determines to be intermediate
+# files. There is no command line switch to turn this "feature" off. Combine
+# this "feature" with implicit rules and have loads of fun.
+.PRECIOUS: $(MAKEFILE_LIST)
+
+#$(info makefile: $(MAKEFILE_LIST))
+#$(info project_MAKECMDGOALS: $(MAKECMDGOALS))
+
+# for recursive make without leaving this makefile
+REMAKE = $(MAKE) -$(MAKEFLAGS) -f $(MAKEFILE_LIST)
+
 #================================================================================
 # Custom make targets
 #
+.PHONY: all ANTLR_OUT_FL
 
 all: ANTLR_OUT_FL
 
 ANTLR_OUT_FL: $(EXECUTOR_IN_DIR)/ANTLR_OUT_FL
 
-
-
 #================================================================================
 # generic targets, aka recipes
 #
 
-# Rule to build .class files from .java files
+# Without this, `make` sees .jar files as intermediate and deletes them.
+.PRECIOUS: $(JAVA_COMP_OUT_DIR)/%.jar
+
+# make .class file from .java file
 $(JAVA_COMP_OUT_DIR)/%.class: $(JAVA_COMP_IN_PRIMARY_DIR)/%.java
        @echo "Compiling $<..."
        $(JAVA_COMP) -d $(JAVA_COMP_OUT_DIR) -sourcepath $(JAVA_COMP_IN_DL) $<
        @echo "Created $@"
 
-# Without this, GNU make inserts an 'rm -rf' not on the recipe and deletes the .jar files
-# after making them.  Why make why?
-.PRECIOUS: $(JAVA_COMP_OUT_DIR)/%.jar
-# Rule to build .jar files from .class files
+# make .jar from .class file
 $(JAVA_COMP_OUT_DIR)/%.jar: $(JAVA_COMP_OUT_DIR)/%.class
        @echo "Building $*..."
        $(JAVA_ARCHIVE) cf $@ -C $(JAVA_COMP_OUT_DIR) $*.class
        @echo "Created $@"
 
+#make the wrapper script from the .jar file
 $(EXECUTOR_IN_DIR)/%: $(JVM_IN_DIR)/%.jar
-       @echo "Creating script for $*..."
+       @echo "Creating program for $*..."
        @echo "#!/usr/bin/env bash" > $(EXECUTOR_IN_DIR)/$*
        @echo "$(JAVA_INTERP) -cp ${CLASSPATH}:${JVM_IN_DP}:$(JVM_IN_DP)/$*.jar $*" \$$\@ >> $(EXECUTOR_IN_DIR)/$*
        chmod +x $(EXECUTOR_IN_DIR)/$*
-       @echo "Created script $(EXECUTOR_IN_DIR)/$*"
+       @echo "Created program $(EXECUTOR_IN_DIR)/$*"
index b4fef26..0642609 100644 (file)
@@ -1,9 +1,39 @@
-$(info top_MAKECMDGOALS: $(MAKECMDGOALS))
+#================================================================================
+# top level makefile calls makefile-tool and makefile-project
+#
+# GNU makefile
 
-.PHONY: all version clean setup tools project
+# turn off implicit rules, because they can do unexpected things.
+.SUFFIXES:
+MAKEFLAGS += -r
 
-# The 'all' target now depends on 'tools' and 'project'
-all: setup tools project
+# `make` considers that PHONY targets do not correspond to files (other
+# targets do and the files have their dates checked). This declaration renders
+# innocuous the "feature" where `make` always tries to make its own
+# makefiles. There is no command line switch to turn this "feature" off.
+.PHONY: $(MAKEFILE_LIST)
+
+# 'make' has a "feature" where it deletes what it determines to be intermediate
+# files. There is no command line switch to turn this "feature" off. Combine
+# this "feature" with implicit rules and have loads of fun.
+.PRECIOUS: $(MAKEFILE_LIST)
+
+#$(info makefile: $(MAKEFILE_LIST))
+#$(info project_MAKECMDGOALS: $(MAKECMDGOALS))
+
+# for recursive make without leaving this makefile
+REMAKE = $(MAKE) -$(MAKEFLAGS) -f $(MAKEFILE_LIST)
+
+#================================================================================
+# Custom make targets
+#
+.PHONY: all nothing version clean setup
+
+all: project-all
+
+# useful for distinguishing between make syntax errors and build errors
+nothing:
+       @:
 
 version:
        $(info ANTLR_JAR is '$(notdir $(ANTLR_JAR))')
@@ -14,20 +44,19 @@ version:
 
 # `clean` is program independent of `make`
 clean:
-       @echo "Use the clean script from the $(EXECUTOR_IN_DIR) directory instead of \`make clean\`"
-       @$(EXECUTOR_IN_DIR)/clean
+       @echo "Use the command `clean <option>` instead of make.`"
 
 setup:
-       mkdir -p $(ANTLR_IN_PRIMARY_DIR) $(JAVA_COMP_IN_PRIMARY_DIR) $(JVM_IN_DIR)
-       mkdir -p $(EXECUTOR_IN_DIR) test deprecated experiment documentation temporary
+       mkdir -p $(ANTLR_IN_PRIMARY_DIR) $(JAVA_COMP_IN_PRIMARY_DIR) $(JVM_IN_DIR) $(EXECUTOR_IN_DIR) test deprecated experiment ologist temporary
+
+# Ensure tools are built before building the project programs
+tool-%: setup
+       $(BIN_MAKE) -f $(EXECUTOR_IN_DIR)/makefile-tool.mk -$(MAKEFLAGS) $*
 
-# Ensure tools like ANTLR_OUT_FL are built before building the project programs
-tools: setup
-       $(BIN_MAKE) -f $(EXECUTOR_IN_DIR)/makefile-tool.mk -$(MAKEFLAGS)
+project-%: tool-all
+       $(BIN_MAKE) -f $(EXECUTOR_IN_DIR)/makefile-project.mk -$(MAKEFLAGS) $*
 
-project: tools
-       $(BIN_MAKE) -f $(EXECUTOR_IN_DIR)/makefile-project.mk -$(MAKEFLAGS)
+# delegate other targets to the project
+%: project-%
+       @:
 
-# all other targets are sent to makefile-project
-%: tools
-       $(BIN_MAKE) -f $(EXECUTOR_IN_DIR)/makefile-project.mk -$(MAKEFLAGS) $@
index c01acc3..c1ba0df 100755 (executable)
@@ -1,2 +1,2 @@
 #!/usr/bin/env bash
-/var/user_data/Thomas-developer/GQL_to_Cypher/tool/jdk-22.0.1+8/bin/java -cp :/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm/ANTLR_OUT_FL.jar ANTLR_OUT_FL $@
+/var/user_data/Thomas-developer/GQL_to_Cypher/tool/jdk-22.0.1+8/bin/java -cp :/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:/var/user_data/Thomas-developer/GQL_to_Cypher/developer/jvm:/var/user_data/Thomas-developer/GQL_to_Cypher/tool/executor/antlr-4.11.1-complete.jar:jvm:jvm/ANTLR_OUT_FL.jar ANTLR_OUT_FL $@
diff --git a/developer/executor/build.gradle b/developer/executor/build.gradle
new file mode 100644 (file)
index 0000000..e53add0
--- /dev/null
@@ -0,0 +1,71 @@
+task setup {
+  doLast {
+    def dirs = [
+      "$(ANTLR_IN_PRIMARY_DIR)"
+      ,"$(JAVA_COMP_IN_DIR)"
+      ,"$(JAVA_COMP_IN_PRIMARY_DIR)"
+      ,"$(JAVA_COMP_IN_ANTLR_DIR)"
+      ,"$(JAVA_COMP_IN_SYN_DIR)"
+      ,"$(JVM_IN_DIR)"
+      ,"$(EXECUTOR_IN_DIR)"
+      ,"test"
+      ,"deprecated"
+      ,"experiment"
+      ,"ologist"
+      ,"temporary"
+    ]
+    dirs.each { dir ->
+      if (!file(dir).exists()) {
+        mkdir dir
+      }
+    }
+  }
+}
+
+task tool(type: Exec) {
+  dependsOn setup
+  commandLine '$(BIN_MAKE)', '-f', '$(EXECUTOR_IN_DIR)/makefile-tool.mk', '-$(MAKEFLAGS)', 'all'
+}
+
+task project(type: Exec) {
+  dependsOn tool
+  commandLine '$(BIN_MAKE)', '-f', '$(EXECUTOR_IN_DIR)/makefile-project.mk', '-$(MAKEFLAGS)', 'all'
+}
+
+task clean {
+  doLast {
+    println "Use the command `clean <option>` instead of make."
+  }
+}
+
+task version {
+  doLast {
+    println "ANTLR_JAR is '${notdir(ANTLR_JAR)}'"
+    exec {
+      commandLine '$(JAVA_COMP)', '--version'
+    }
+    exec {
+      commandLine '$(JAVA_ARCHIVE)', '--version'
+    }
+    exec {
+      commandLine 'make', '-v'
+    }
+    println "makefile 0.4"
+  }
+}
+
+task all {
+  dependsOn project
+}
+
+task nothing {
+  doLast {
+    // useful for distinguishing between make syntax errors and build errors
+  }
+}
+
+tasks.withType(Exec) {
+  doFirst {
+    println "Executing $name"
+  }
+}
index d4852b8..ba97b07 100755 (executable)
@@ -55,6 +55,7 @@ export EXECUTOR_IN_FL="\
   Arithmetic2_SyntaxAnnotate\
   Arithmetic2_SyntaxAnnotate__Test\
   ANTLRv4_SyntaxAnnotate\
+  Arithmetic_Swap\
   "
 
 # where make will put the programs
@@ -73,8 +74,10 @@ export ANTLR_OUT_DIR="javac/ANTLR"
 export ANTLR_OUT_DIR_PARENT="javac"
 
 # JAVA directories
-export JAVA_COMP_IN_PRIMARY_DIR="javac"
+export JAVA_COMP_IN_DIR="javac"
+export JAVA_COMP_IN_PRIMARY_DIR="javac/primary"
 export JAVA_COMP_IN_ANTLR_DIR="${ANTLR_OUT_DIR}"
+export JAVA_COMP_IN_SYN_DIR="javac/synthesized"
 export JAVA_COMP_IN_DL="${JAVA_COMP_IN_PRIMARY_DIR}:${JAVA_COMP_IN_ANTLR_DIR}"
 export JAVA_COMP_OUT_DIR="jvm"
 
diff --git a/developer/executor/gradle b/developer/executor/gradle
new file mode 100755 (executable)
index 0000000..9bd00ef
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+
+if [[ -z "${DEVELOPER_HOME}" || -z "${EXECUTOR_IN_DIR}" ]]; then
+  echo "required variables not set. As seen by:"
+  echo "  DEVELOPER_HOME: $DEVELOPER_HOME"
+  echo "  EXECUTOR_IN_DIR: $EXECUTOR_IN_DIR"
+  exit 1
+fi
+
+cd "$DEVELOPER_HOME"
+
+# in case there have been edits to the environment
+source "${EXECUTOR_IN_DIR}"/env_build
+
+"${GRADLE_HOME}"/bin/gradle -b "${EXECUTOR_IN_DIR}"/build.gradle "$@"
diff --git a/developer/executor/make b/developer/executor/make
deleted file mode 100755 (executable)
index 714a070..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-if [[ -z "${DEVELOPER_HOME}" || -z "${EXECUTOR_IN_DIR}" ]]; then
-  echo "required variables not set. As seen by:"
-  echo "  DEVELOPER_HOME: $DEVELOPER_HOME"
-  echo "  EXECUTOR_IN_DIR: $EXECUTOR_IN_DIR"
-  exit 1
-fi
-
-cd "$DEVELOPER_HOME"
-
-# in case there have been edits to the environment
-source "${EXECUTOR_IN_DIR}"/env_build
-
-${BIN_MAKE} --no-print-directory -f "${EXECUTOR_IN_DIR}"/makefile-top.mk $@
diff --git a/developer/executor/makefile-project.mk b/developer/executor/makefile-project.mk
deleted file mode 100644 (file)
index 277884e..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-#--------------------------------------------------------------------------------
-# Project build
-#
-# GNU makefile
-
-# turn off implicit rules, because they can do unexpected things.
-.SUFFIXES:
-MAKEFLAGS += -r
-
-# `make` considers that PHONY targets do not correspond to files (other
-# targets do and the files have their dates checked). This declaration renders
-# innocuous the "feature" where `make` always tries to make its own
-# makefiles. There is no command line switch to turn this "feature" off.
-.PHONY: $(MAKEFILE_LIST)
-
-# 'make' has a "feature" where it deletes what it determines to be intermediate
-# files. There is no command line switch to turn this "feature" off. Combine
-# this "feature" with implicit rules and have loads of fun.
-.PRECIOUS: $(MAKEFILE_LIST)
-
-#$(info makefile: $(MAKEFILE_LIST))
-#$(info project_MAKECMDGOALS: $(MAKECMDGOALS))
-
-# for recursive make without leaving this makefile
-REMAKE = $(MAKE) -$(MAKEFLAGS) -f $(MAKEFILE_LIST)
-
-#================================================================================
-# Custom make targets
-#
-
-all: $(EXECUTOR_IN_FPL)
-
-
-#-----------------------------------------------
-# These do not require antlr generated java files
-
-RuleNameListRegx: $(EXECUTOR_IN_DIR)/RuleNameListRegx
-RuleNameList: $(EXECUTOR_IN_DIR)/RuleNameList
-
-Synthesize_SyntaxAnnotate_PrintVisitorMethod:\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/StringUtils.java\
-  $(EXECUTOR_IN_DIR)/Synthesize_SyntaxAnnotate_PrintVisitorMethod
-Synthesize_SyntaxAnnotate_PrintVisitor:\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/StringUtils.java\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java\
-  $(EXECUTOR_IN_DIR)/Synthesize_SyntaxAnnotate_PrintVisitor
-
-Synthesize_SyntaxAnnotate:\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/StringUtils.java\
-  $(EXECUTOR_IN_DIR)/Synthesize_SyntaxAnnotate
-
-#-----------------------------------------------
-# Arithmetic
-
-ANTLR_OUT_Arithmetic_FPL:= $(shell ANTLR_OUT_FL Arithmetic -path $(ANTLR_OUT_DIR))
-#$(info ANTLR_OUT_Arithmetic_FPL: $(ANTLR_OUT_Arithmetic_FPL))
-Arithmetic_Echo:\
-  $(ANTLR_OUT_Arithmetic_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Echo_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Echo
-
-Arithmetic_Echo__Test:\
-  $(ANTLR_OUT_Arithmetic_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_Echo_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_Echo__Test
-
-Arithmetic_SyntaxAnnotate:\
-  $(ANTLR_OUT_Arithmetic_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_SyntaxAnnotate_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_SyntaxAnnotate
-
-Arithmetic_SyntaxAnnotate__Test:\
-  $(ANTLR_OUT_Arithmetic_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic_SyntaxAnnotate_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic_SyntaxAnnotate__Test
-
-#-----------------------------------------------
-# Arithmetic2
-# 
-
-ANTLR_OUT_Arithmetic2_FPL:= $(shell ANTLR_OUT_FL Arithmetic2 -path $(ANTLR_OUT_DIR))
-Arithmetic2_SyntaxAnnotate:\
-  $(ANTLR_OUT_Arithmetic2_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic2_SyntaxAnnotate_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic2_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic2_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic2_SyntaxAnnotate
-
-Arithmetic2_SyntaxAnnotate__Test:\
-  $(ANTLR_OUT_Arithmetic2_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/Arithmetic2_SyntaxAnnotate_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic2_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic2_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/Arithmetic2_SyntaxAnnotate__Test
-
-#-----------------------------------------------
-# Parsing/Analyzing ANTLR grammars
-#
-
-ANTLR_OUT_ANTLRv4_FPL:= $(shell ANTLR_OUT_FL ANTLRv4 -path $(ANTLR_OUT_DIR))
-ANTLRv4_SyntaxAnnotate:\
-  $(ANTLR_OUT_ANTLRv4_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/ANTLRv4_SyntaxAnnotate_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_ANTLRv4_FPL)" ]; then \
-         echo "variable ANTLR_OUT_ANTLRv4_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/ANTLRv4_SyntaxAnnotate
-
-
-#-----------------------------------------------
-#  GQL_20240412
-
-ANTLR_OUT_GQL_20240412_FPL := $(shell ANTLR_OUT_FL GQL_20240412 -path $(ANTLR_OUT_DIR))
-GQL_20240412_SyntaxAnnotate:\
-  $(ANTLR_OUT_GQL_20240412_FPL)\
-  $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_SyntaxAnnotate_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
-         echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/GQL_20240412_SyntaxAnnotate
-
-GQL_20240412_SyntaxAnnotate__Test: \
-  $(ANTLR_OUT_GQL_20240412_FPL) \
-  $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_SyntaxAnnotate_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
-         echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
-         exit 1; \
-       fi
-       $(REMAKE) $(EXECUTOR_IN_DIR)/GQL_20240412_SyntaxAnnotate__Test
-
-
-TerminalToCategory: 
-       $(REMAKE) $(EXECUTOR_IN_DIR)/TerminalToCategory
-
-GrammarSplitter: 
-       $(REMAKE) $(EXECUTOR_IN_DIR)/GrammarSplitter
-
-#-----------------------------------------------
-# Compile all the .java files.
-
-java: $(JAVA_COMP_OUT_FPL)
-
-
-#================================================================================
-# generic targets, aka recipes
-#
-
-# this section is not parallel make friendly
-# $(ANTLR_OUT_DIR)/%Lexer.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
-#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-# $(ANTLR_OUT_DIR)/%Parser.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
-#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-# $(ANTLR_OUT_DIR)/%BaseListener.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
-#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-# $(ANTLR_OUT_DIR)/%Listener.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
-#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-# $(ANTLR_OUT_DIR)/%BaseVisitor.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
-#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-# $(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
-#      $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-
-#--------------------
-# for a single `<name>.g4` grammar file
-$(ANTLR_OUT_DIR)/%Lexer.java \
-$(ANTLR_OUT_DIR)/%Parser.java \
-$(ANTLR_OUT_DIR)/%BaseListener.java \
-$(ANTLR_OUT_DIR)/%Listener.java \
-$(ANTLR_OUT_DIR)/%BaseVisitor.java \
-$(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_DIR)/%.g4
-       @echo "copiling grammar from:" $<
-       $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-
-#--------------------
-# For separate `<mame>Lexer.g4` and `<name>Parser.g4` files.
-# `make` prefers shorter pattern matches, so this should work.
-#
-
-$(ANTLR_OUT_DIR)/LexerAdaptor.java: $(ANTLR_IN_PRIMARY_DIR)/LexerAdaptor.java
-       cp $(ANTLR_IN_PRIMARY_DIR)/LexerAdaptor.java $(ANTLR_OUT_DIR)
-
-$(ANTLR_OUT_DIR)/%Lexer.java: $(ANTLR_IN_PRIMARY_DIR)/%Lexer.g4 $(ANTLR_OUT_DIR)/LexerAdaptor.java
-       @echo "making lexer grammar from:" $<
-       $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -o $(ANTLR_OUT_DIR_PARENT) $<
-
-# Rule for all generated files from Parser.g4
-$(ANTLR_OUT_DIR)/%Parser.java \
-$(ANTLR_OUT_DIR)/%BaseListener.java \
-$(ANTLR_OUT_DIR)/%Listener.java \
-$(ANTLR_OUT_DIR)/%BaseVisitor.java \
-$(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_DIR)/%Parser.g4
-       @echo "making other grammar files from:" $<
-       $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -lib $(ANTLR_OUT_DIR) -o $(ANTLR_OUT_DIR_PARENT) $<
-
-#--------------------------------------------------------------------------------
-
-# Rule to build .class files from .java files
-$(JAVA_COMP_OUT_DIR)/%.class: $(JAVA_COMP_IN_PRIMARY_DIR)/%.java
-       @echo "Compiling $<..."
-       $(JAVA_COMP) -d $(JAVA_COMP_OUT_DIR) -sourcepath $(JAVA_COMP_IN_DL) $<
-       @echo "Created $@"
-
-# Without this, GNU make inserts an 'rm -rf' not on the recipe and deletes the .jar files
-# after making them.  Why make why?
-.PRECIOUS: $(JAVA_COMP_OUT_DIR)/%.jar
-# Rule to build .jar files from .class files
-$(JAVA_COMP_OUT_DIR)/%.jar: $(JAVA_COMP_OUT_DIR)/%.class
-       @echo "Building $*..."
-       $(JAVA_ARCHIVE) cf $@ -C $(JAVA_COMP_OUT_DIR) $*.class
-       @echo "Created $@"
-
-#--------------------
-$(EXECUTOR_IN_DIR)/%: $(JVM_IN_DIR)/%.jar
-       @echo "Creating program for $*..."
-       @echo "#!/usr/bin/env bash" > $(EXECUTOR_IN_DIR)/$*
-       @echo "$(JAVA_INTERP) -cp ${CLASSPATH}:${JVM_IN_DP}:$(JVM_IN_DP)/$*.jar $*" \$$\@ >> $(EXECUTOR_IN_DIR)/$*
-       chmod +x $(EXECUTOR_IN_DIR)/$*
-       @echo "Created program $(EXECUTOR_IN_DIR)/$*"
diff --git a/developer/executor/makefile-tool.mk b/developer/executor/makefile-tool.mk
deleted file mode 100644 (file)
index 1e7e88c..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#================================================================================
-# Build the tools that are needed for building the project.
-#
-# GNU makefile
-
-# turn off implicit rules, because they can do unexpected things.
-.SUFFIXES:
-MAKEFLAGS += -r
-
-# `make` considers that PHONY targets do not correspond to files (other
-# targets do and the files have their dates checked). This declaration renders
-# innocuous the "feature" where `make` always tries to make its own
-# makefiles. There is no command line switch to turn this "feature" off.
-.PHONY: $(MAKEFILE_LIST)
-
-# 'make' has a "feature" where it deletes what it determines to be intermediate
-# files. There is no command line switch to turn this "feature" off. Combine
-# this "feature" with implicit rules and have loads of fun.
-.PRECIOUS: $(MAKEFILE_LIST)
-
-#$(info makefile: $(MAKEFILE_LIST))
-#$(info project_MAKECMDGOALS: $(MAKECMDGOALS))
-
-# for recursive make without leaving this makefile
-REMAKE = $(MAKE) -$(MAKEFLAGS) -f $(MAKEFILE_LIST)
-
-#================================================================================
-# Custom make targets
-#
-.PHONY: tool
-
-all: ANTLR_OUT_FL
-
-ANTLR_OUT_FL: $(EXECUTOR_IN_DIR)/ANTLR_OUT_FL
-
-
-
-#================================================================================
-# generic targets, aka recipes
-#
-
-# Rule to build .class files from .java files
-$(JAVA_COMP_OUT_DIR)/%.class: $(JAVA_COMP_IN_PRIMARY_DIR)/%.java
-       @echo "Compiling $<..."
-       $(JAVA_COMP) -d $(JAVA_COMP_OUT_DIR) -sourcepath $(JAVA_COMP_IN_DL) $<
-       @echo "Created $@"
-
-# Without this, GNU make inserts an 'rm -rf' not on the recipe and deletes the .jar files
-# after making them.  Why make why?
-.PRECIOUS: $(JAVA_COMP_OUT_DIR)/%.jar
-# Rule to build .jar files from .class files
-$(JAVA_COMP_OUT_DIR)/%.jar: $(JAVA_COMP_OUT_DIR)/%.class
-       @echo "Building $*..."
-       $(JAVA_ARCHIVE) cf $@ -C $(JAVA_COMP_OUT_DIR) $*.class
-       @echo "Created $@"
-
-$(EXECUTOR_IN_DIR)/%: $(JVM_IN_DIR)/%.jar
-       @echo "Creating script for $*..."
-       @echo "#!/usr/bin/env bash" > $(EXECUTOR_IN_DIR)/$*
-       @echo "$(JAVA_INTERP) -cp ${CLASSPATH}:${JVM_IN_DP}:$(JVM_IN_DP)/$*.jar $*" \$$\@ >> $(EXECUTOR_IN_DIR)/$*
-       chmod +x $(EXECUTOR_IN_DIR)/$*
-       @echo "Created script $(EXECUTOR_IN_DIR)/$*"
diff --git a/developer/executor/makefile-top.mk b/developer/executor/makefile-top.mk
deleted file mode 100644 (file)
index 0642609..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#================================================================================
-# top level makefile calls makefile-tool and makefile-project
-#
-# GNU makefile
-
-# turn off implicit rules, because they can do unexpected things.
-.SUFFIXES:
-MAKEFLAGS += -r
-
-# `make` considers that PHONY targets do not correspond to files (other
-# targets do and the files have their dates checked). This declaration renders
-# innocuous the "feature" where `make` always tries to make its own
-# makefiles. There is no command line switch to turn this "feature" off.
-.PHONY: $(MAKEFILE_LIST)
-
-# 'make' has a "feature" where it deletes what it determines to be intermediate
-# files. There is no command line switch to turn this "feature" off. Combine
-# this "feature" with implicit rules and have loads of fun.
-.PRECIOUS: $(MAKEFILE_LIST)
-
-#$(info makefile: $(MAKEFILE_LIST))
-#$(info project_MAKECMDGOALS: $(MAKECMDGOALS))
-
-# for recursive make without leaving this makefile
-REMAKE = $(MAKE) -$(MAKEFLAGS) -f $(MAKEFILE_LIST)
-
-#================================================================================
-# Custom make targets
-#
-.PHONY: all nothing version clean setup
-
-all: project-all
-
-# useful for distinguishing between make syntax errors and build errors
-nothing:
-       @:
-
-version:
-       $(info ANTLR_JAR is '$(notdir $(ANTLR_JAR))')
-       @ $(JAVA_COMP) --version
-       @ $(JAVA_ARCHIVE) --version
-       @ make -v | head -n 1
-       @ echo "makefile 0.4"
-
-# `clean` is program independent of `make`
-clean:
-       @echo "Use the command `clean <option>` instead of make.`"
-
-setup:
-       mkdir -p $(ANTLR_IN_PRIMARY_DIR) $(JAVA_COMP_IN_PRIMARY_DIR) $(JVM_IN_DIR) $(EXECUTOR_IN_DIR) test deprecated experiment ologist temporary
-
-# Ensure tools are built before building the project programs
-tool-%: setup
-       $(BIN_MAKE) -f $(EXECUTOR_IN_DIR)/makefile-tool.mk -$(MAKEFLAGS) $*
-
-project-%: tool-all
-       $(BIN_MAKE) -f $(EXECUTOR_IN_DIR)/makefile-project.mk -$(MAKEFLAGS) $*
-
-# delegate other targets to the project
-%: project-%
-       @:
-
diff --git a/developer/javac/ANTLR_OUT_FL.java b/developer/javac/ANTLR_OUT_FL.java
deleted file mode 100644 (file)
index 365212f..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
-  Run the command with no arguments for a usage message.
-
-  Accepts an antlr grammar file name of the form: [path/]<name>[Lexer/Parser][.g4]
-
-  Prints a space-separated list of files antlr4 would output.
-
-  The <name>Lexer or <name>Parser suffix, or absence thereof, tell this program if
-  antlr would create lexer and parser files, or both.
-
-
-*/
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-public class ANTLR_OUT_FL {
-
-  private static final String USAGE_MESSAGE = 
-    "Usage: ANTLR_OUT_FL <grammar-name> "
-    +" [-visitor (default)] [-no-visitor] "
-    +" [-listener] [-no-listener (default)] "
-    +" [-tokens] [-no-tokens (default)] "
-    +" [-path <path>]"
-    ;
-
-  public static void main(String[] args) {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    boolean visitor = true;
-    boolean noListener = true;
-    boolean noTokens = true;
-    String outputPath = "";
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        case "-visitor":
-          visitor = true;
-          break;
-        case "-no-visitor":
-          visitor = false;
-          break;
-        case "-listener":
-          noListener = false;
-          break;
-        case "-no-listener":
-          noListener = true;
-          break;
-        case "-tokens":
-          noTokens = false;
-          break;
-        case "-no-tokens":
-          noTokens = true;
-          break;
-        case "-path":
-          // Ensure the next argument exists and isn't another option
-          if (i + 1 < args.length && !args[i + 1].startsWith("-")) {
-            outputPath = args[++i];  // Get the next argument as the path
-            if (!outputPath.endsWith("/")) {
-              outputPath += "/";  // Ensure the path ends with a slash
-            }
-          } else {
-            System.err.println("expected argument after option: " + args[i]);
-            error = true;
-          }
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }        
-    }
-    if (argList.size() != 1) {
-      System.err.println("Expected exactly one non-option argument.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String grammarName = argList.get(0);
-
-    List<String> generatedFiles = generateFileList(grammarName, visitor, noListener, noTokens, outputPath);
-
-    // Print the files in a space-separated format on a single line
-    if (!generatedFiles.isEmpty()) {
-      System.out.print(generatedFiles.get(0)); // Print the first file
-      for (int i = 1; i < generatedFiles.size(); i++) {
-        System.out.print(" " + generatedFiles.get(i)); // Print space and each subsequent file
-      }
-    }
-    System.out.println(); // Print a newline at the end
-  }
-
-  public static List<String> generateFileList(String grammarName, boolean visitor, boolean noListener, boolean noTokens, String outputPath) {
-    String baseName = new File(grammarName).getName().replace(".g4", "");
-    List<String> fileList = new ArrayList<>();
-
-    // Determine if this is a lexer, parser, or both
-    boolean isLexer = baseName.endsWith("Lexer");
-    boolean isParser = baseName.endsWith("Parser");
-    boolean isCombined = !isLexer && !isParser;
-
-    if (isLexer || isCombined) {
-      // Lexer files
-      fileList.add(outputPath + baseName + "Lexer.java");
-      if (!noTokens) fileList.add(outputPath + baseName + "Lexer.tokens");
-    }
-
-    if (isParser || isCombined) {
-      // Parser files
-      fileList.add(outputPath + baseName + "Parser.java");
-      if (!noTokens) fileList.add(outputPath + baseName + ".tokens");
-
-      // Listener-related files
-      if (!noListener) {
-        fileList.add(outputPath + baseName + "Listener.java");
-        fileList.add(outputPath + baseName + "BaseListener.java");
-      }
-
-      // Visitor-related files
-      if (visitor) {
-        fileList.add(outputPath + baseName + "Visitor.java");
-        fileList.add(outputPath + baseName + "BaseVisitor.java");
-      }
-    }
-
-    return fileList;
-  }
-}
diff --git a/developer/javac/Arithmetic2_SyntaxAnnotate.java b/developer/javac/Arithmetic2_SyntaxAnnotate.java
deleted file mode 100644 (file)
index c4577ca..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/* This file generated by Synthesize_SyntaxAnnotate given the grammar
-   name: Arithmetic2.
-
-   SyntaxAnnotate programs accept a source file, then echo the source file with
-   syntax annotation. Synthesize_SyntaxAnnotate produces a SyntaxAnnotate program
-   for a specific grammar.
- */
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.tree.*;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Arithmetic2_SyntaxAnnotate {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE =
-    "Usage: Arithmetic2_SyntaxAnnotate [-version] [-pp] <source-file-path>";
-
-  public static void main(String[] args) throws IOException {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    boolean pretty_print = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        case "-pp":
-          pretty_print = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }
-    }
-    if (argList.size() != 1) {
-      System.err.println("Expected exactly one non-option argument.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String input_file = argList.get(0);
-    String input = Files.readString(Paths.get(input_file));
-
-    try {
-      Arithmetic2Lexer lexer = new Arithmetic2Lexer(CharStreams.fromString(input));
-      CommonTokenStream tokens = new CommonTokenStream(lexer);
-      Arithmetic2Parser parser = new Arithmetic2Parser(tokens);
-      ParseTree tree = parser.program();
-
-      Arithmetic2_SyntaxAnnotate_PrintVisitor visitor = new Arithmetic2_SyntaxAnnotate_PrintVisitor(parser.getRuleNames(), pretty_print);
-      String output = visitor.visit(tree);
-      System.out.println(output);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/developer/javac/Arithmetic2_SyntaxAnnotate_PrintVisitor.java b/developer/javac/Arithmetic2_SyntaxAnnotate_PrintVisitor.java
deleted file mode 100644 (file)
index 28a4866..0000000
+++ /dev/null
@@ -1,663 +0,0 @@
-/* This file synthesized by Synthesize_SyntaxAnnotate_PrintVisitor.
-*/
-import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
-
-public class Arithmetic2_SyntaxAnnotate_PrintVisitor extends AbstractParseTreeVisitor<String> {
-  private final String[] ruleNames;
-
-  public Arithmetic2_SyntaxAnnotate_PrintVisitor(String[] ruleNames) {
-    this.ruleNames = ruleNames;
-  }
-
-    public String visitgrammarSpec (Arithmetic2Parser.grammarSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("grammarSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitgrammarDecl (Arithmetic2Parser.grammarDeclContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("grammarDecl(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitgrammarType (Arithmetic2Parser.grammarTypeContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("grammarType(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitprequelConstruct (Arithmetic2Parser.prequelConstructContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("prequelConstruct(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitoptionsSpec (Arithmetic2Parser.optionsSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("optionsSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitoption (Arithmetic2Parser.optionContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("option(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitoptionValue (Arithmetic2Parser.optionValueContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("optionValue(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitdelegateGrammars (Arithmetic2Parser.delegateGrammarsContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("delegateGrammars(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitdelegateGrammar (Arithmetic2Parser.delegateGrammarContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("delegateGrammar(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visittokensSpec (Arithmetic2Parser.tokensSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("tokensSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitchannelsSpec (Arithmetic2Parser.channelsSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("channelsSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitidList (Arithmetic2Parser.idListContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("idList(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitaction_ (Arithmetic2Parser.action_Context ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("action_(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitactionScopeName (Arithmetic2Parser.actionScopeNameContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("actionScopeName(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitactionBlock (Arithmetic2Parser.actionBlockContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("actionBlock(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitargActionBlock (Arithmetic2Parser.argActionBlockContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("argActionBlock(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitmodeSpec (Arithmetic2Parser.modeSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("modeSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitrules (Arithmetic2Parser.rulesContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("rules(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleSpec (Arithmetic2Parser.ruleSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitparserRuleSpec (Arithmetic2Parser.parserRuleSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("parserRuleSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitexceptionGroup (Arithmetic2Parser.exceptionGroupContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("exceptionGroup(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitexceptionHandler (Arithmetic2Parser.exceptionHandlerContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("exceptionHandler(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitfinallyClause (Arithmetic2Parser.finallyClauseContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("finallyClause(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitrulePrequel (Arithmetic2Parser.rulePrequelContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("rulePrequel(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleReturns (Arithmetic2Parser.ruleReturnsContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleReturns(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitthrowsSpec (Arithmetic2Parser.throwsSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("throwsSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlocalsSpec (Arithmetic2Parser.localsSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("localsSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleAction (Arithmetic2Parser.ruleActionContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleAction(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleModifiers (Arithmetic2Parser.ruleModifiersContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleModifiers(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleModifier (Arithmetic2Parser.ruleModifierContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleModifier(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleBlock (Arithmetic2Parser.ruleBlockContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleBlock(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleAltList (Arithmetic2Parser.ruleAltListContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleAltList(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlabeledAlt (Arithmetic2Parser.labeledAltContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("labeledAlt(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerRuleSpec (Arithmetic2Parser.lexerRuleSpecContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerRuleSpec(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerRuleBlock (Arithmetic2Parser.lexerRuleBlockContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerRuleBlock(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerAltList (Arithmetic2Parser.lexerAltListContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerAltList(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerAlt (Arithmetic2Parser.lexerAltContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerAlt(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerElements (Arithmetic2Parser.lexerElementsContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerElements(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerElement (Arithmetic2Parser.lexerElementContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerElement(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerBlock (Arithmetic2Parser.lexerBlockContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerBlock(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerCommands (Arithmetic2Parser.lexerCommandsContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerCommands(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerCommand (Arithmetic2Parser.lexerCommandContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerCommand(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerCommandName (Arithmetic2Parser.lexerCommandNameContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerCommandName(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerCommandExpr (Arithmetic2Parser.lexerCommandExprContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerCommandExpr(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitaltList (Arithmetic2Parser.altListContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("altList(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitalternative (Arithmetic2Parser.alternativeContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("alternative(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitelement (Arithmetic2Parser.elementContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("element(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitpredicateOptions (Arithmetic2Parser.predicateOptionsContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("predicateOptions(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitpredicateOption (Arithmetic2Parser.predicateOptionContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("predicateOption(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlabeledElement (Arithmetic2Parser.labeledElementContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("labeledElement(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitebnf (Arithmetic2Parser.ebnfContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ebnf(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitblockSuffix (Arithmetic2Parser.blockSuffixContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("blockSuffix(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitebnfSuffix (Arithmetic2Parser.ebnfSuffixContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ebnfSuffix(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitlexerAtom (Arithmetic2Parser.lexerAtomContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("lexerAtom(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitatom (Arithmetic2Parser.atomContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("atom(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitnotSet (Arithmetic2Parser.notSetContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("notSet(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitblockSet (Arithmetic2Parser.blockSetContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("blockSet(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitsetElement (Arithmetic2Parser.setElementContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("setElement(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitblock (Arithmetic2Parser.blockContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("block(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitruleref (Arithmetic2Parser.rulerefContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("ruleref(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitcharacterRange (Arithmetic2Parser.characterRangeContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("characterRange(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitterminalDef (Arithmetic2Parser.terminalDefContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("terminalDef(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitelementOptions (Arithmetic2Parser.elementOptionsContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("elementOptions(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitelementOption (Arithmetic2Parser.elementOptionContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("elementOption(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-  public String visitidentifier (Arithmetic2Parser.identifierContext ctx) {
-    StringBuilder result = new StringBuilder();
-    result.append("identifier(");
-    for (int i = 0; i < ctx.getChildCount(); i++) {
-      if (i > 0) result.append(", ");
-      result.append(visit(ctx.getChild(i)));
-    }
-    result.append(")");
-    return result.toString();
-  }
-
-}
diff --git a/developer/javac/Arithmetic_Echo.java b/developer/javac/Arithmetic_Echo.java
deleted file mode 100644 (file)
index 8fadf28..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-Takes an 'Ariethemetic' grammar source file.  Parses it. Runs through the parse tree
-and recreates the source file.
-
-*/
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.tree.*;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Arithmetic_Echo {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE =
-    "Usage: Arithmetic_Echo [-version] <source-file-path>";
-
-  public static void main(String[] args) throws IOException {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }        
-    }
-    if (argList.size() != 1) {
-      System.err.println("Expected exactly one non-option argument.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String inputFile = argList.get(0);
-    String input = Files.readString(Paths.get(inputFile));
-
-    try {
-      // Direct instantiation without reflection
-      ArithmeticLexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
-      CommonTokenStream tokens = new CommonTokenStream(lexer);
-      ArithmeticParser parser = new ArithmeticParser(tokens);
-
-      // Directly calling the start rule method
-      ParseTree tree = parser.program(); // Assuming 'program' is the start rule
-
-      Arithmetic_Echo_PrintVisitor visitor = new Arithmetic_Echo_PrintVisitor(parser.getRuleNames());
-      String output = visitor.visit(tree);
-      System.out.println(output);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/developer/javac/Arithmetic_Echo_PrintVisitor.java b/developer/javac/Arithmetic_Echo_PrintVisitor.java
deleted file mode 100644 (file)
index 488d54a..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
-
-public class Arithmetic_Echo_PrintVisitor extends ArithmeticBaseVisitor<String> {
-  private final String[] ruleNames;
-
-  public Arithmetic_Echo_PrintVisitor(String[] ruleNames) {
-    this.ruleNames = ruleNames;
-  }
-
-  @Override
-  public String visitProgram(ArithmeticParser.ProgramContext ctx) {
-    return visit(ctx.expression());
-  }
-
-  @Override
-  public String visitExpression(ArithmeticParser.ExpressionContext ctx) {
-    if (ctx.INT() != null) {
-      return ctx.INT().getText();
-    } else if (ctx.getChildCount() == 3 && ctx.getChild(0).getText().equals("(")) {
-      // Handle parentheses
-      return visit(ctx.expression(0));  // Remove the extra parentheses
-    } else {
-      String left = visit(ctx.expression(0));
-      String right = visit(ctx.expression(1));
-      String operator = ctx.getChild(1).getText();
-      return "(" + left + " " + operator + " " + right + ")";
-    }
-  }
-
-}
-
diff --git a/developer/javac/Arithmetic_Echo__Test.java b/developer/javac/Arithmetic_Echo__Test.java
deleted file mode 100644 (file)
index 8e670b1..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.tree.*;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Arithmetic_Echo__Test {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE =
-    "Usage: Arithmetic_Echo__Test [-version]";
-
-  public static void main(String[] args) {
-    // if (args.length == 0) {
-    //   System.err.println(USAGE_MESSAGE);
-    //   System.exit(1);
-    // }
-    boolean error = false;
-    boolean version = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }        
-    }
-    if (argList.size() != 0) {
-      System.err.println("This program takes no arguments.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    Map<String, Boolean> tests = new HashMap<>();
-    tests.put("Arithmetic_Echo_0", Arithmetic_Echo_0());
-    tests.put("Arithmetic_Echo_1", Arithmetic_Echo_1());
-    tests.put("Arithmetic_Echo_2", Arithmetic_Echo_2());
-    tests.put("Arithmetic_Echo_3", Arithmetic_Echo_3());
-    tests.put("Arithmetic_Echo_4", Arithmetic_Echo_4());
-
-    TestBench.runTests(tests);
-  }
-
-  public static boolean Arithmetic_Echo_0() {
-    // Simple smoke test
-    try {
-      String input = "3 + 5";
-      String expectedOutput = "(3 + 5)";
-      String actualOutput = runSyntax(input);
-      return expectedOutput.equals(actualOutput);
-    } catch (Exception e) {
-      return false;
-    }
-  }
-
-  public static boolean Arithmetic_Echo_1() {
-    // Test with multiplication
-    try {
-      String input = "2 * 3";
-      String expectedOutput = "(2 * 3)";
-      String actualOutput = runSyntax(input);
-      return expectedOutput.equals(actualOutput);
-    } catch (Exception e) {
-      return false;
-    }
-  }
-
-  public static boolean Arithmetic_Echo_2() {
-    // Test with parentheses
-    try {
-      String input = "2 * (3 + 4)";
-      String expectedOutput = "(2 * (3 + 4))";
-      String actualOutput = runSyntax(input);
-      return expectedOutput.equals(actualOutput);
-    } catch (Exception e) {
-      return false;
-    }
-  }
-
-  public static boolean Arithmetic_Echo_3() {
-    // Test with division
-    try {
-      String input = "10 / 2";
-      String expectedOutput = "(10 / 2)";
-      String actualOutput = runSyntax(input);
-      return expectedOutput.equals(actualOutput);
-    } catch (Exception e) {
-      return false;
-    }
-  }
-
-  public static boolean Arithmetic_Echo_4() {
-    // Test with complex expression
-    try {
-      String input = "3 + 5 * (10 - 4)";
-      String expectedOutput = "(3 + (5 * (10 - 4)))";
-      String actualOutput = runSyntax(input);
-      return expectedOutput.equals(actualOutput);
-    } catch (Exception e) {
-      return false;
-    }
-  }
-
-  private static String runSyntax(String input) throws Exception {
-    Lexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
-    CommonTokenStream tokens = new CommonTokenStream(lexer);
-    ArithmeticParser parser = new ArithmeticParser(tokens);
-    Method startRule = parser.getClass().getMethod("program");
-    ParseTree tree = (ParseTree) startRule.invoke(parser);
-
-    Arithmetic_Echo_PrintVisitor visitor = new Arithmetic_Echo_PrintVisitor(parser.getRuleNames());
-    return visitor.visit(tree);
-  }
-}
diff --git a/developer/javac/Arithmetic_SyntaxAnnotate.java b/developer/javac/Arithmetic_SyntaxAnnotate.java
deleted file mode 100644 (file)
index 0516db6..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-Takes an 'Ariethemetic' grammar source file.  Parses it. Outputs an annotated
-version of the source file while labeling what parts of the grammar the syntax
-objects belong to.  Note the -pp option.
-
-*/
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.tree.*;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Arithmetic_SyntaxAnnotate {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE = 
-    "Usage: Arithmetic_SyntaxAnnotate [-version] [-pp] <source-file>";
-
-  public static void main(String[] args) throws IOException {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    boolean pretty_print = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        case "-pp":
-          pretty_print = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }
-    }
-    if (argList.size() != 1) {
-      System.err.println("Expected exactly one non-option argument.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String input_file = argList.get(0);
-    String input = Files.readString(Paths.get(input_file));
-
-    try {
-      ArithmeticLexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
-      CommonTokenStream tokens = new CommonTokenStream(lexer);
-      ArithmeticParser parser = new ArithmeticParser(tokens);
-      ParseTree tree = parser.program();
-
-      Arithmetic_SyntaxAnnotate_PrintVisitor visitor = 
-        new Arithmetic_SyntaxAnnotate_PrintVisitor(parser.getRuleNames(), pretty_print);
-      String output = visitor.visit(tree);
-      System.out.println(output);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/developer/javac/Arithmetic_SyntaxAnnotate_PrintVisitor.java b/developer/javac/Arithmetic_SyntaxAnnotate_PrintVisitor.java
deleted file mode 100644 (file)
index 9831e54..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
-
-public class Arithmetic_SyntaxAnnotate_PrintVisitor extends ArithmeticBaseVisitor<String>{
-  private final String[] rule_names;
-  private final boolean pretty_print;
-
-  public Arithmetic_SyntaxAnnotate_PrintVisitor(String[] rule_names, boolean pretty_print){
-    this.rule_names = rule_names;
-    this.pretty_print = pretty_print;
-  }
-
-  private String indent(int level){
-    return "  ".repeat(level);
-  }
-
-  @Override
-  public String visitProgram(ArithmeticParser.ProgramContext ctx){
-    if(pretty_print){
-      StringBuilder result = new StringBuilder();
-      result.append("program\n").append(visitExpression(ctx.expression(), 1));
-      return result.toString();
-    }else{
-      return "program(" + visit(ctx.expression()) + ")";
-    }
-  }
-
-  @Override
-  public String visitExpression(ArithmeticParser.ExpressionContext ctx){
-    return visitExpression(ctx, 0);
-  }
-
-  private String visitExpression(ArithmeticParser.ExpressionContext ctx, int indent_level){
-    StringBuilder result = new StringBuilder();
-    if(pretty_print){
-      result.append(indent(indent_level)).append("expression(\n");
-      if( ctx.INT() != null ){
-        result.append(indent(indent_level + 1)).append("INT(").append(ctx.INT().getText()).append(")\n");
-      }else if( ctx.getChildCount() == 3 && ctx.getChild(0).getText().equals("(") ){
-        result.append(indent(indent_level + 1)).append("(\n");
-        result.append(visitExpression(ctx.expression(0), indent_level + 2));
-        result.append(indent(indent_level + 1)).append(")\n");
-      }else{
-        result.append(visitExpression(ctx.expression(0), indent_level + 1));
-        result.append(indent(indent_level + 1)).append("operator(").append(ctx.getChild(1).getText()).append(")\n");
-        result.append(visitExpression(ctx.expression(1), indent_level + 1));
-      }
-      result.append(indent(indent_level)).append(")\n");
-    }else{
-      if( ctx.INT() != null ){
-        result.append("INT(").append(ctx.INT().getText()).append(")");
-      }else if( ctx.getChildCount() == 3 && ctx.getChild(0).getText().equals("(") ){
-        result.append("(").append(visit(ctx.expression(0))).append(")");
-      }else{
-        String left = visit(ctx.expression(0));
-        String right = visit(ctx.expression(1));
-        String operator = "operator(" + ctx.getChild(1).getText() + ")";
-        result.append("expression(").append(left).append(" ").append(operator).append(" ").append(right).append(")");
-      }
-    }
-    return result.toString();
-  }
-}
diff --git a/developer/javac/Arithmetic_SyntaxAnnotate__Test.java b/developer/javac/Arithmetic_SyntaxAnnotate__Test.java
deleted file mode 100644 (file)
index a80b690..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.tree.*;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Arithmetic_SyntaxAnnotate__Test {
-
-  public static boolean Arithmetic_SyntaxAnnotate_0() {
-    return runTest(
-      "Arithmetic_SyntaxAnnotate__Test_0.txt"
-     ,"program(expression(INT(3) operator(+) INT(5)))"
-     );
-  }
-
-  public static boolean Arithmetic_SyntaxAnnotate_1() {
-    return runTest(
-      "Arithmetic_SyntaxAnnotate__Test_1.txt"
-      ,"program(expression(INT(3) operator(+) INT(5)))"
-   );
-  }
-
-  public static boolean Arithmetic_SyntaxAnnotate_2() {
-    return runTest(
-      "Arithmetic_SyntaxAnnotate__Test_2.txt" 
-      ,"program(expression(INT(2) operator(*) (expression(INT(3) operator(+) INT(4)))))"
-      );
-  }
-
-  public static boolean Arithmetic_SyntaxAnnotate_3() {
-    return runTest(
-      "Arithmetic_SyntaxAnnotate__Test_3.txt" 
-      ,"program(expression(INT(10) operator(/) INT(2)))"
-      );
-  }
-
-  public static boolean Arithmetic_SyntaxAnnotate_4() {
-    return runTest(
-      "Arithmetic_SyntaxAnnotate__Test_4.txt" 
-      ,"program(expression(INT(3) operator(+) expression(INT(5) operator(*) (expression(INT(10) operator(-) INT(4))))))"
-      );
-  }
-
-  private static boolean runTest(String filename ,String expectedOutput) {
-    try {
-      String input = Files.readString(Paths.get(filename));
-      String actualOutput = runSyntaxAnnotate(input);
-      return expectedOutput.equals(actualOutput);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return false;
-    }
-  }
-
-  private static String runSyntaxAnnotate(String input) throws Exception {
-    Lexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
-    CommonTokenStream tokens = new CommonTokenStream(lexer);
-    ArithmeticParser parser = new ArithmeticParser(tokens);
-    ParseTree tree = parser.program(); // Directly calling the start rule method
-
-    Arithmetic_SyntaxAnnotate_PrintVisitor visitor = new Arithmetic_SyntaxAnnotate_PrintVisitor(parser.getRuleNames() ,false);
-    return visitor.visit(tree);
-  }
-
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE = 
-    "Usage: Arithmetic_SyntaxAnnotate__Test [-version]";
-
-  public static void main(String[] args) {
-    // if (args.length == 0) {
-    //   System.err.println(USAGE_MESSAGE);
-    //   System.exit(1);
-    // }
-    boolean error = false;
-    boolean version = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }        
-    }
-    if (argList.size() != 0) {
-      System.err.println("This program takes no arguments.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    // Use LinkedHashMap to maintain order of test results
-    Map<String, Boolean> tests = new LinkedHashMap<>();
-    tests.put("Arithmetic_SyntaxAnnotate_0", Arithmetic_SyntaxAnnotate_0());
-    tests.put("Arithmetic_SyntaxAnnotate_1", Arithmetic_SyntaxAnnotate_1());
-    tests.put("Arithmetic_SyntaxAnnotate_2", Arithmetic_SyntaxAnnotate_2());
-    tests.put("Arithmetic_SyntaxAnnotate_3", Arithmetic_SyntaxAnnotate_3());
-    tests.put("Arithmetic_SyntaxAnnotate_4", Arithmetic_SyntaxAnnotate_4());
-
-    TestBench.runTests(tests);
-  }
-
-}
-
diff --git a/developer/javac/RuleNameList.java b/developer/javac/RuleNameList.java
deleted file mode 100644 (file)
index c9b727c..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
-  Accepts an grammar name (not a file path or file name) and outputs the rule
-  names found in the grammar.  
-
-  RuleNameList does not run antlr to build the grammar files, that must have
-  been done separately before this program is run.
-
-  RuleNameList produces a more reliable list than does RuleNameListRegx.
-
-  RuleNameList does not output terminal symbols (the lexer tokens).
-
-  Usage: ANTLRv4_RuleNames <input-file>
-*/
-
-import org.antlr.v4.runtime.*;
-import java.util.ArrayList;
-import java.util.List;
-
-public class RuleNameList {
-
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE =
-    "Usage: RuleNameList"
-    +" [-version]"
-    +" [-rule (default)] [-no-rule]"
-    +" [-token] [-no-token (default)]"
-    +" <grammar-name>"
-    ;
-
-  public static void main(String[] args) {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    boolean printRules = true;
-    boolean printTokens = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        case "-rule":
-          printRules = true;
-          break;
-        case "-no-rule":
-          printRules = false;
-          break;
-        case "-token":
-          printTokens = true;
-          break;
-        case "-no-token":
-          printTokens = false;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }        
-    }
-    if (argList.size() != 1) {
-      System.err.println("Expected exactly one non-option argument.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String grammarName = argList.get(0);
-    // in case the user provided a path instead of a name:
-    grammarName = Paths.get(grammarName).getFileName().toString().replace(".g4", "");
-
-    try {
-      // Dynamically load the appropriate lexer and parser
-      Class<?> lexerClass = Class.forName(grammarName + "Lexer");
-      Class<?> parserClass = Class.forName(grammarName + "Parser");
-
-      // Create instances of the lexer and parser
-      Lexer lexer = (Lexer) lexerClass.getConstructor(CharStream.class).newInstance(CharStreams.fromString(""));
-      CommonTokenStream tokens = new CommonTokenStream(lexer);
-      Parser parser = (Parser) parserClass.getConstructor(TokenStream.class).newInstance(tokens);
-
-      // Get the rule names from the parser
-      List<String> ruleNames = List.of(parser.getRuleNames());
-
-      // Get the token names from the lexer
-      List<String> tokenNames = List.of(lexer.getTokenNames());
-
-      // Print the rule names if requested
-      if (printRules) {
-        if (printTokens) {
-          System.out.println("#----------------------------------------");
-          System.out.println("# Rule names found in the grammar:");
-        }
-        for (String ruleName : ruleNames) {
-          System.out.println(ruleName);
-        }
-      }
-
-      // Print the token names if requested
-      if (printTokens) {
-        if (printRules) {
-          System.out.println("#----------------------------------------");
-          System.out.println("# Token names found in the grammar:");
-        }
-        for (String tokenName : tokenNames) {
-          System.out.println(tokenName);
-        }
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/developer/javac/RuleNameListRegx.java b/developer/javac/RuleNameListRegx.java
deleted file mode 100644 (file)
index 36ffb2b..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-Directly reads an ANTLR grammar file, a `.g4` file, and lists all the rules found in it.
-
-*/
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.ArrayList;
-import java.util.List;
-
-public class RuleNameListRegx {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE =
-    "Usage: RuleNameListRegx [-version] <path-to-g4-file>";
-
-  public static void main(String[] args) {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    boolean pretty_print = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        case "-pp":
-          pretty_print = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }
-    }
-    if (argList.size() != 1) {
-      System.err.println("Expected exactly one non-option argument.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String filePath = argList.get(0);
-
-    try {
-      Set<String> ruleNames = new HashSet<>();
-      BufferedReader br = new BufferedReader(new FileReader(filePath));
-      StringBuilder content = new StringBuilder();
-      String line;
-      while ((line = br.readLine()) != null) {
-        content.append(line).append("\n");
-      }
-
-      // Updated pattern to handle multi-line rules
-      Pattern rulePattern = Pattern.compile("(?m)^\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*:");
-
-      Matcher matcher = rulePattern.matcher(content.toString());
-      while (matcher.find()) {
-        ruleNames.add(matcher.group(1));
-      }
-
-      System.out.println("Extracted Rules:");
-      for (String rule : ruleNames) {
-        System.out.println(rule);
-      }
-    } catch (IOException e) {
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/developer/javac/StringUtils.java b/developer/javac/StringUtils.java
deleted file mode 100644 (file)
index 774e253..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-public class StringUtils {
-
-    private static int spacesPerIndentLevel = 2; // Default to 2 spaces per indent level
-
-    public static void setSpacesPerIndentLevel(int spaces) {
-        spacesPerIndentLevel = spaces;
-    }
-
-    public static String indentString(String template, int indentLevel) {
-        String indent = " ".repeat(spacesPerIndentLevel * indentLevel);
-        String[] lines = template.split("\n");
-        StringBuilder indentedTemplate = new StringBuilder();
-        for (String line : lines) {
-            indentedTemplate.append(indent).append(line).append("\n");
-        }
-        return indentedTemplate.toString();
-    }
-}
diff --git a/developer/javac/Synthesize_SyntaxAnnotate.java b/developer/javac/Synthesize_SyntaxAnnotate.java
deleted file mode 100644 (file)
index 6f002f1..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.tree.*;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Synthesize_SyntaxAnnotate {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE = 
-    "Usage: Synthesize_SyntaxAnnotate [-version] <grammar-name> <output-file-path>";
-
-  public static void main(String[] args) throws IOException {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }        
-    }
-    if (argList.size() != 2) {
-      System.err.println("Expected exactly two non-option arguments.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String grammarName = argList.get(0);
-    // in case the user provided a path instead of a name:
-    grammarName = Paths.get(grammarName).getFileName().toString().replace(".g4", "");
-
-    String outputFile = argList.get(1);
-
-    synthesizeSyntaxAnnotateClass(grammarName, outputFile);
-  }
-
-  private static void synthesizeSyntaxAnnotateClass(String grammarName, String outputFile) throws IOException {
-    String className = grammarName + "_SyntaxAnnotate";
-    String lexerName = grammarName + "Lexer";
-    String parserName = grammarName + "Parser";
-    String visitorName = grammarName + "_SyntaxAnnotate_PrintVisitor";
-
-    // Template for the SyntaxAnnotate class
-    String classTemplate = """
-      /* This file generated by Synthesize_SyntaxAnnotate given the grammar 
-         name: ____4_.
-         
-         SyntaxAnnotate programs accept a source file, then echo the source file with
-         syntax annotation. Synthesize_SyntaxAnnotate produces a SyntaxAnnotate program
-         for a specific grammar.
-       */
-      import org.antlr.v4.runtime.*;
-      import org.antlr.v4.runtime.tree.*;
-      import java.io.IOException;
-      import java.nio.file.Files;
-      import java.nio.file.Paths;
-      import java.util.ArrayList;
-      import java.util.List;
-
-      public class ____0_ {
-        // Constant for the usage message
-        private static final String USAGE_MESSAGE =
-          "Usage: ____0_ [-version] [-pp] <source-file-path>";
-
-        public static void main(String[] args) throws IOException {
-          if (args.length == 0) {
-            System.err.println(USAGE_MESSAGE);
-            System.exit(1);
-          }
-          boolean error = false;
-          boolean version = false;
-          boolean pretty_print = false;
-          List<String> argList = new ArrayList<>();
-          for (int i = 0; i < args.length; i++) {
-            String arg = args[i];
-            if (arg.startsWith("-")) {
-              switch (arg) {
-              case "-version":
-                version = true;
-                break;
-              case "-pp":
-                pretty_print = true;
-                break;
-              default:
-                System.err.println("Unrecognized option: " + arg);
-                error = true;
-              }
-            } else {
-              argList.add(arg);
-            }
-          }
-          if(version){
-            System.out.println("version 0.1");
-            if(error){
-              System.exit(1);
-            }else{
-              System.exit(0);
-            }        
-          }
-          if (argList.size() != 1) {
-            System.err.println("Expected exactly one non-option argument.");
-            error = true;
-          }
-          if(error){
-            System.err.println(USAGE_MESSAGE);
-            System.exit(1);
-          }
-
-          String input_file = argList.get(0);
-          String input = Files.readString(Paths.get(input_file));
-
-          try {
-            ____1_ lexer = new ____1_(CharStreams.fromString(input));
-            CommonTokenStream tokens = new CommonTokenStream(lexer);
-            ____2_ parser = new ____2_(tokens);
-            ParseTree tree = parser.program();
-
-            ____3_ visitor = new ____3_(parser.getRuleNames(), pretty_print);
-            String output = visitor.visit(tree);
-            System.out.println(output);
-          } catch (Exception e) {
-            e.printStackTrace();
-          }
-        }
-      }
-      """;
-
-    // Fill in the blanks in the template
-    classTemplate = classTemplate.replace("____0_", className);
-    classTemplate = classTemplate.replace("____1_", lexerName);
-    classTemplate = classTemplate.replace("____2_", parserName);
-    classTemplate = classTemplate.replace("____3_", visitorName);
-    classTemplate = classTemplate.replace("____4_", grammarName);
-
-    // Write the synthesized class to the output file
-    Files.writeString(Paths.get(outputFile), classTemplate);
-  }
-}
-
-//  LocalWords:  SyntaxAnnotate
diff --git a/developer/javac/Synthesize_SyntaxAnnotate_PrintVisitor.java b/developer/javac/Synthesize_SyntaxAnnotate_PrintVisitor.java
deleted file mode 100644 (file)
index ae508b0..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.tree.*;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.List;
-import java.io.PrintWriter;
-
-public class Synthesize_SyntaxAnnotate_PrintVisitor {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE = 
-    "Usage: Synthesize_SyntaxAnnotate_PrintVisitor"
-    +" [-version]"
-    +" <g4-grammar-file-path> <outputFile> [indent-level (default 0)]"
-    ;
-
-  public static void main(String[] args) throws IOException {
-  if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    int indentLevel = 0;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if (version) {
-      System.out.println("Version 0.1");
-      if (error) {
-        System.exit(1);
-      } else {
-        System.exit(0);
-      }
-    }
-    if (argList.size() < 2 || argList.size() > 3) {
-      System.err.println("Expected two or three non-option arguments.");
-      error = true;
-    }
-    if (error) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String grammarFilePath = argList.get(0);
-    String outputFile      = argList.get(1);
-    if (argList.size() == 3) {
-      indentLevel = Integer.parseInt(argList.get(2));
-    }
-
-    String grammarName = Paths.get(grammarFilePath).getFileName().toString().replace(".g4", "");
-    String parserName = grammarName + "Parser";
-    String visitorClassName = grammarName + "_SyntaxAnnotate_PrintVisitor";
-
-    // Parse the .g4 file
-    CharStream input = CharStreams.fromFileName(grammarFilePath);
-    ANTLRv4Lexer lexer = new ANTLRv4Lexer(input);
-    CommonTokenStream tokens = new CommonTokenStream(lexer);
-    ANTLRv4Parser parser = new ANTLRv4Parser(tokens);
-
-    // Extract rules
-    ParseTree tree = parser.grammarSpec();
-    List<String> ruleNames = extractRuleNames(parser);
-
-    // Synthesize the print methods
-    StringBuilder printMethods = new StringBuilder();
-    for (String ruleName : ruleNames) {
-      printMethods.append(Synthesize_SyntaxAnnotate_PrintVisitorMethod.synthesizePrintMethod(parserName, ruleName, indentLevel + 1));
-    }
-
-    // Template for the PrintVisitor class
-    String classTemplate = """
-      /* This file synthesized by Synthesize_SyntaxAnnotate_PrintVisitor.
-      */
-      import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
-
-      public class ____0_ extends AbstractParseTreeVisitor<String> {
-        private final String[] ruleNames;
-
-        public ____0_(String[] ruleNames) {
-          this.ruleNames = ruleNames;
-        }
-
-        ____1_
-      }
-      """;
-
-    classTemplate = classTemplate.replace("____0_", visitorClassName);
-    classTemplate = classTemplate.replace("____1_", printMethods.toString());
-
-    try (PrintWriter writer = new PrintWriter(outputFile)) {
-      writer.print(classTemplate);
-    }
-  }
-
-  private static List<String> extractRuleNames(Parser parser) {
-    // Extract rule names from the parser
-    return Arrays.asList(parser.getRuleNames());
-  }
-}
-
-//  LocalWords:  SyntaxAnnotate PrintVisitor
diff --git a/developer/javac/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java b/developer/javac/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java
deleted file mode 100644 (file)
index 35394bb..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-import java.util.ArrayList;
-import java.util.List;
-import java.io.PrintWriter;
-
-public class Synthesize_SyntaxAnnotate_PrintVisitorMethod {
-  // Constant for the usage message
-  private static final String USAGE_MESSAGE = 
-    "Usage: Synthesize_SyntaxAnnotate_PrintVisitorMethod"
-    + " [-version]"
-    +" <grammar-name> <g4-rule-name> <output-file>"
-    ;
-
-  public static void main(String[] args) {
-    if (args.length == 0) {
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-    boolean error = false;
-    boolean version = false;
-    List<String> argList = new ArrayList<>();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i];
-      if (arg.startsWith("-")) {
-        switch (arg) {
-        case "-version":
-          version = true;
-          break;
-        default:
-          System.err.println("Unrecognized option: " + arg);
-          error = true;
-        }
-      } else {
-        argList.add(arg);
-      }
-    }
-    if(version){
-      System.out.println("version 0.1");
-      if(error){
-        System.exit(1);
-      }else{
-        System.exit(0);
-      }        
-    }
-    if (argList.size() != 3) {
-      System.err.println("Expected exactly three non-option arguments.");
-      error = true;
-    }
-    if(error){
-      System.err.println(USAGE_MESSAGE);
-      System.exit(1);
-    }
-
-    String grammarName = argList.get(0);
-    String ruleName    = argList.get(1);
-    String outputFile  = argList.get(2);
-
-    String parserName = grammarName + "Parser";
-    
-    try {
-      PrintWriter writer = new PrintWriter(outputFile);
-      // start at indent level 0
-      writer.print(synthesizePrintMethod(parserName, ruleName, 0)); 
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-
-  public static String synthesizePrintMethod(String parserName, String ruleName, int indentLevel) {
-    // Template for the print method using text blocks
-    String template = """
-      public String visit____0_ (____1_.____0_Context ctx) {
-        StringBuilder result = new StringBuilder();
-        result.append("____0_(");
-        for (int i = 0; i < ctx.getChildCount(); i++) {
-          if (i > 0) result.append(", ");
-          result.append(visit(ctx.getChild(i)));
-        }
-        result.append(")");
-        return result.toString();
-      }
-      """;
-
-    // Fill in the blanks in the template
-    template = template.replace("____0_", ruleName);
-    template = template.replace("____1_", parserName);
-
-    // Indent the template
-    return StringUtils.indentString(template, indentLevel);
-  }
-}
diff --git a/developer/javac/TestBench.java b/developer/javac/TestBench.java
deleted file mode 100644 (file)
index 8bdcc67..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-import java.util.Map;
-
-public class TestBench {
-
-    public static void runTests(Map<String, Boolean> tests) {
-        int totalTests = tests.size();
-        int passedTests = 0;
-        int failedTests = 0;
-
-        for (Map.Entry<String, Boolean> test : tests.entrySet()) {
-            try {
-                if (test.getValue()) {
-                    passedTests++;
-                } else {
-                    System.out.println("failed: " + test.getKey());
-                    failedTests++;
-                }
-            } catch (Exception e) {
-                System.out.println("failed: " + test.getKey());
-                failedTests++;
-            }
-        }
-
-        System.out.println("Total tests run: " + totalTests);
-        System.out.println("Total tests passed: " + passedTests);
-        System.out.println("Total tests failed: " + failedTests);
-    }
-}
diff --git a/developer/javac/primary/ANTLR_OUT_FL.java b/developer/javac/primary/ANTLR_OUT_FL.java
new file mode 100644 (file)
index 0000000..f852af5
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+  Run the command with no arguments for a usage message.
+
+  Accepts an antlr grammar file name of the form: [path/]<name>[Lexer/Parser][.g4]
+
+  Prints a space-separated list of files antlr4 would output.
+
+  The <name>Lexer or <name>Parser suffix, or absence thereof, tell this program if
+  antlr would create lexer and parser files, or both.
+
+
+*/
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ANTLR_OUT_FL {
+
+  private static final String USAGE_MESSAGE = 
+    "Usage: ANTLR_OUT_FL <grammar-name> "
+    +" [-visitor (default)] [-no-visitor] "
+    +" [-listener] [-no-listener (default)] "
+    +" [-tokens] [-no-tokens (default)] "
+    +" [-path <path>]"
+    ;
+
+  public static void main(String[] args) {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    boolean visitor = true;
+    boolean noListener = true;
+    boolean noTokens = true;
+    String outputPath = "";
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        case "-visitor":
+          visitor = true;
+          break;
+        case "-no-visitor":
+          visitor = false;
+          break;
+        case "-listener":
+          noListener = false;
+          break;
+        case "-no-listener":
+          noListener = true;
+          break;
+        case "-tokens":
+          noTokens = false;
+          break;
+        case "-no-tokens":
+          noTokens = true;
+          break;
+        case "-path":
+          // Ensure the next argument exists and isn't another option
+          if (i + 1 < args.length && !args[i + 1].startsWith("-")) {
+            outputPath = args[++i];  // Get the next argument as the path
+            if (!outputPath.endsWith("/")) {
+              outputPath += "/";  // Ensure the path ends with a slash
+            }
+          } else {
+            System.err.println("expected argument after option: " + args[i]);
+            error = true;
+          }
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      System.exit(error ? 1 : 0);
+    }
+    if (argList.size() != 1) {
+      System.err.println("Expected exactly one non-option argument.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String grammarName = argList.get(0);
+
+    List<String> generatedFiles = generateFileList(grammarName, visitor, noListener, noTokens, outputPath);
+
+    // Print the files in a space-separated format on a single line
+    if (!generatedFiles.isEmpty()) {
+      System.out.print(generatedFiles.get(0)); // Print the first file
+      for (int i = 1; i < generatedFiles.size(); i++) {
+        System.out.print(" " + generatedFiles.get(i)); // Print space and each subsequent file
+      }
+    }
+    System.out.println(); // Print a newline at the end
+  }
+
+  public static List<String> generateFileList(String grammarName, boolean visitor, boolean noListener, boolean noTokens, String outputPath) {
+    String baseName = new File(grammarName).getName().replace(".g4", "");
+    List<String> fileList = new ArrayList<>();
+
+    // Determine if this is a lexer, parser, or both
+    boolean isLexer = baseName.endsWith("Lexer");
+    boolean isParser = baseName.endsWith("Parser");
+    boolean isCombined = !isLexer && !isParser;
+
+    if (isLexer || isCombined) {
+      // Lexer files
+      fileList.add(outputPath + baseName + "Lexer.java");
+      if (!noTokens) fileList.add(outputPath + baseName + "Lexer.tokens");
+    }
+
+    if (isParser || isCombined) {
+      // Parser files
+      fileList.add(outputPath + baseName + "Parser.java");
+      if (!noTokens) fileList.add(outputPath + baseName + ".tokens");
+
+      // Listener-related files
+      if (!noListener) {
+        fileList.add(outputPath + baseName + "Listener.java");
+        fileList.add(outputPath + baseName + "BaseListener.java");
+      }
+
+      // Visitor-related files
+      if (visitor) {
+        fileList.add(outputPath + baseName + "Visitor.java");
+        fileList.add(outputPath + baseName + "BaseVisitor.java");
+      }
+    }
+
+    return fileList;
+  }
+}
diff --git a/developer/javac/primary/Arithmetic_Echo.java b/developer/javac/primary/Arithmetic_Echo.java
new file mode 100644 (file)
index 0000000..8fadf28
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+Takes an 'Ariethemetic' grammar source file.  Parses it. Runs through the parse tree
+and recreates the source file.
+
+*/
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Arithmetic_Echo {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE =
+    "Usage: Arithmetic_Echo [-version] <source-file-path>";
+
+  public static void main(String[] args) throws IOException {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }        
+    }
+    if (argList.size() != 1) {
+      System.err.println("Expected exactly one non-option argument.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String inputFile = argList.get(0);
+    String input = Files.readString(Paths.get(inputFile));
+
+    try {
+      // Direct instantiation without reflection
+      ArithmeticLexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
+      CommonTokenStream tokens = new CommonTokenStream(lexer);
+      ArithmeticParser parser = new ArithmeticParser(tokens);
+
+      // Directly calling the start rule method
+      ParseTree tree = parser.program(); // Assuming 'program' is the start rule
+
+      Arithmetic_Echo_PrintVisitor visitor = new Arithmetic_Echo_PrintVisitor(parser.getRuleNames());
+      String output = visitor.visit(tree);
+      System.out.println(output);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/developer/javac/primary/Arithmetic_Echo_PrintVisitor.java b/developer/javac/primary/Arithmetic_Echo_PrintVisitor.java
new file mode 100644 (file)
index 0000000..488d54a
--- /dev/null
@@ -0,0 +1,31 @@
+import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
+
+public class Arithmetic_Echo_PrintVisitor extends ArithmeticBaseVisitor<String> {
+  private final String[] ruleNames;
+
+  public Arithmetic_Echo_PrintVisitor(String[] ruleNames) {
+    this.ruleNames = ruleNames;
+  }
+
+  @Override
+  public String visitProgram(ArithmeticParser.ProgramContext ctx) {
+    return visit(ctx.expression());
+  }
+
+  @Override
+  public String visitExpression(ArithmeticParser.ExpressionContext ctx) {
+    if (ctx.INT() != null) {
+      return ctx.INT().getText();
+    } else if (ctx.getChildCount() == 3 && ctx.getChild(0).getText().equals("(")) {
+      // Handle parentheses
+      return visit(ctx.expression(0));  // Remove the extra parentheses
+    } else {
+      String left = visit(ctx.expression(0));
+      String right = visit(ctx.expression(1));
+      String operator = ctx.getChild(1).getText();
+      return "(" + left + " " + operator + " " + right + ")";
+    }
+  }
+
+}
+
diff --git a/developer/javac/primary/Arithmetic_Echo__Test.java b/developer/javac/primary/Arithmetic_Echo__Test.java
new file mode 100644 (file)
index 0000000..8e670b1
--- /dev/null
@@ -0,0 +1,134 @@
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Arithmetic_Echo__Test {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE =
+    "Usage: Arithmetic_Echo__Test [-version]";
+
+  public static void main(String[] args) {
+    // if (args.length == 0) {
+    //   System.err.println(USAGE_MESSAGE);
+    //   System.exit(1);
+    // }
+    boolean error = false;
+    boolean version = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }        
+    }
+    if (argList.size() != 0) {
+      System.err.println("This program takes no arguments.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    Map<String, Boolean> tests = new HashMap<>();
+    tests.put("Arithmetic_Echo_0", Arithmetic_Echo_0());
+    tests.put("Arithmetic_Echo_1", Arithmetic_Echo_1());
+    tests.put("Arithmetic_Echo_2", Arithmetic_Echo_2());
+    tests.put("Arithmetic_Echo_3", Arithmetic_Echo_3());
+    tests.put("Arithmetic_Echo_4", Arithmetic_Echo_4());
+
+    TestBench.runTests(tests);
+  }
+
+  public static boolean Arithmetic_Echo_0() {
+    // Simple smoke test
+    try {
+      String input = "3 + 5";
+      String expectedOutput = "(3 + 5)";
+      String actualOutput = runSyntax(input);
+      return expectedOutput.equals(actualOutput);
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+  public static boolean Arithmetic_Echo_1() {
+    // Test with multiplication
+    try {
+      String input = "2 * 3";
+      String expectedOutput = "(2 * 3)";
+      String actualOutput = runSyntax(input);
+      return expectedOutput.equals(actualOutput);
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+  public static boolean Arithmetic_Echo_2() {
+    // Test with parentheses
+    try {
+      String input = "2 * (3 + 4)";
+      String expectedOutput = "(2 * (3 + 4))";
+      String actualOutput = runSyntax(input);
+      return expectedOutput.equals(actualOutput);
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+  public static boolean Arithmetic_Echo_3() {
+    // Test with division
+    try {
+      String input = "10 / 2";
+      String expectedOutput = "(10 / 2)";
+      String actualOutput = runSyntax(input);
+      return expectedOutput.equals(actualOutput);
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+  public static boolean Arithmetic_Echo_4() {
+    // Test with complex expression
+    try {
+      String input = "3 + 5 * (10 - 4)";
+      String expectedOutput = "(3 + (5 * (10 - 4)))";
+      String actualOutput = runSyntax(input);
+      return expectedOutput.equals(actualOutput);
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+  private static String runSyntax(String input) throws Exception {
+    Lexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
+    CommonTokenStream tokens = new CommonTokenStream(lexer);
+    ArithmeticParser parser = new ArithmeticParser(tokens);
+    Method startRule = parser.getClass().getMethod("program");
+    ParseTree tree = (ParseTree) startRule.invoke(parser);
+
+    Arithmetic_Echo_PrintVisitor visitor = new Arithmetic_Echo_PrintVisitor(parser.getRuleNames());
+    return visitor.visit(tree);
+  }
+}
diff --git a/developer/javac/primary/Arithmetic_Swap.java b/developer/javac/primary/Arithmetic_Swap.java
new file mode 100644 (file)
index 0000000..58e1caf
--- /dev/null
@@ -0,0 +1,69 @@
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Arithmetic_Swap {
+  private static final String USAGE_MESSAGE =
+    "Usage: Arithmetic_Swap [-version] <source-file-path>";
+
+  public static void main(String[] args) throws IOException {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    List<String> argList = new ArrayList<>();
+    for (String arg : args) {
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if (version) {
+      System.out.println("version 0.1");
+      System.exit(error ? 1 : 0);
+    }
+    if (argList.size() != 1) {
+      System.err.println("Expected exactly one non-option argument.");
+      error = true;
+    }
+    if (error) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String inputFile = argList.get(0);
+    String input = Files.readString(Paths.get(inputFile));
+
+    try {
+      ArithmeticLexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
+      CommonTokenStream tokens = new CommonTokenStream(lexer);
+      ArithmeticParser parser = new ArithmeticParser(tokens);
+      
+      ParseTree tree = parser.program();
+
+      Arithmetic_SwapVisitor swapVisitor = new Arithmetic_SwapVisitor();
+      ParseTree transformedTree = swapVisitor.visit(tree);
+
+      Arithmetic_Echo_PrintVisitor printVisitor = new Arithmetic_Echo_PrintVisitor(parser.getRuleNames());
+      String output = printVisitor.visit(transformedTree);
+
+      System.out.println(output);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/developer/javac/primary/Arithmetic_SwapVisitor.java b/developer/javac/primary/Arithmetic_SwapVisitor.java
new file mode 100644 (file)
index 0000000..f108735
--- /dev/null
@@ -0,0 +1,50 @@
+import org.antlr.v4.runtime.tree.*;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+
+public class Arithmetic_SwapVisitor extends AbstractParseTreeVisitor<ParseTree> {
+
+    @Override
+    public ParseTree visit(ParseTree tree) {
+        if (tree instanceof ParserRuleContext) {
+            ParserRuleContext ctx = (ParserRuleContext) tree;
+            ParserRuleContext newCtx = new ParserRuleContext();
+
+            // Recursively visit all children and add them to the new context
+            for (int i = 0; i < ctx.getChildCount(); i++) {
+                ParseTree child = ctx.getChild(i);
+                ParseTree visitedChild = this.visit(child);
+                
+                // Add child if it's a valid type
+                if (visitedChild instanceof ParserRuleContext) {
+                    newCtx.addChild((ParserRuleContext) visitedChild);
+                } else if (visitedChild instanceof TerminalNode) {
+                    newCtx.addChild((TerminalNode) visitedChild);
+                }
+            }
+            return newCtx;
+        } else if (tree instanceof TerminalNode) {
+            TerminalNode node = (TerminalNode) tree;
+            // Swap operators based on text
+            switch (node.getText()) {
+                case "+":
+                    return createTerminalNode(node, ArithmeticParser.MINUS); // Swap + with -
+                case "-":
+                    return createTerminalNode(node, ArithmeticParser.PLUS);  // Swap - with +
+                case "*":
+                    return createTerminalNode(node, ArithmeticParser.DIVIDE); // Swap * with /
+                case "/":
+                    return createTerminalNode(node, ArithmeticParser.MULTIPLY); // Swap / with *
+                default:
+                    return node; // Return node as is for non-operator tokens
+            }
+        }
+        return null;
+    }
+
+    // Helper method to create a new TerminalNode with the swapped token
+    private TerminalNode createTerminalNode(TerminalNode oldNode, int newTokenType) {
+        Token newToken = new CommonToken(newTokenType, oldNode.getText());
+        return new TerminalNodeImpl(newToken);
+    }
+}
diff --git a/developer/javac/primary/Arithmetic_SyntaxAnnotate.java b/developer/javac/primary/Arithmetic_SyntaxAnnotate.java
new file mode 100644 (file)
index 0000000..0516db6
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+Takes an 'Ariethemetic' grammar source file.  Parses it. Outputs an annotated
+version of the source file while labeling what parts of the grammar the syntax
+objects belong to.  Note the -pp option.
+
+*/
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Arithmetic_SyntaxAnnotate {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE = 
+    "Usage: Arithmetic_SyntaxAnnotate [-version] [-pp] <source-file>";
+
+  public static void main(String[] args) throws IOException {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    boolean pretty_print = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        case "-pp":
+          pretty_print = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }
+    }
+    if (argList.size() != 1) {
+      System.err.println("Expected exactly one non-option argument.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String input_file = argList.get(0);
+    String input = Files.readString(Paths.get(input_file));
+
+    try {
+      ArithmeticLexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
+      CommonTokenStream tokens = new CommonTokenStream(lexer);
+      ArithmeticParser parser = new ArithmeticParser(tokens);
+      ParseTree tree = parser.program();
+
+      Arithmetic_SyntaxAnnotate_PrintVisitor visitor = 
+        new Arithmetic_SyntaxAnnotate_PrintVisitor(parser.getRuleNames(), pretty_print);
+      String output = visitor.visit(tree);
+      System.out.println(output);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/developer/javac/primary/Arithmetic_SyntaxAnnotate_PrintVisitor.java b/developer/javac/primary/Arithmetic_SyntaxAnnotate_PrintVisitor.java
new file mode 100644 (file)
index 0000000..9831e54
--- /dev/null
@@ -0,0 +1,62 @@
+import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
+
+public class Arithmetic_SyntaxAnnotate_PrintVisitor extends ArithmeticBaseVisitor<String>{
+  private final String[] rule_names;
+  private final boolean pretty_print;
+
+  public Arithmetic_SyntaxAnnotate_PrintVisitor(String[] rule_names, boolean pretty_print){
+    this.rule_names = rule_names;
+    this.pretty_print = pretty_print;
+  }
+
+  private String indent(int level){
+    return "  ".repeat(level);
+  }
+
+  @Override
+  public String visitProgram(ArithmeticParser.ProgramContext ctx){
+    if(pretty_print){
+      StringBuilder result = new StringBuilder();
+      result.append("program\n").append(visitExpression(ctx.expression(), 1));
+      return result.toString();
+    }else{
+      return "program(" + visit(ctx.expression()) + ")";
+    }
+  }
+
+  @Override
+  public String visitExpression(ArithmeticParser.ExpressionContext ctx){
+    return visitExpression(ctx, 0);
+  }
+
+  private String visitExpression(ArithmeticParser.ExpressionContext ctx, int indent_level){
+    StringBuilder result = new StringBuilder();
+    if(pretty_print){
+      result.append(indent(indent_level)).append("expression(\n");
+      if( ctx.INT() != null ){
+        result.append(indent(indent_level + 1)).append("INT(").append(ctx.INT().getText()).append(")\n");
+      }else if( ctx.getChildCount() == 3 && ctx.getChild(0).getText().equals("(") ){
+        result.append(indent(indent_level + 1)).append("(\n");
+        result.append(visitExpression(ctx.expression(0), indent_level + 2));
+        result.append(indent(indent_level + 1)).append(")\n");
+      }else{
+        result.append(visitExpression(ctx.expression(0), indent_level + 1));
+        result.append(indent(indent_level + 1)).append("operator(").append(ctx.getChild(1).getText()).append(")\n");
+        result.append(visitExpression(ctx.expression(1), indent_level + 1));
+      }
+      result.append(indent(indent_level)).append(")\n");
+    }else{
+      if( ctx.INT() != null ){
+        result.append("INT(").append(ctx.INT().getText()).append(")");
+      }else if( ctx.getChildCount() == 3 && ctx.getChild(0).getText().equals("(") ){
+        result.append("(").append(visit(ctx.expression(0))).append(")");
+      }else{
+        String left = visit(ctx.expression(0));
+        String right = visit(ctx.expression(1));
+        String operator = "operator(" + ctx.getChild(1).getText() + ")";
+        result.append("expression(").append(left).append(" ").append(operator).append(" ").append(right).append(")");
+      }
+    }
+    return result.toString();
+  }
+}
diff --git a/developer/javac/primary/Arithmetic_SyntaxAnnotate__Test.java b/developer/javac/primary/Arithmetic_SyntaxAnnotate__Test.java
new file mode 100644 (file)
index 0000000..a80b690
--- /dev/null
@@ -0,0 +1,125 @@
+
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Arithmetic_SyntaxAnnotate__Test {
+
+  public static boolean Arithmetic_SyntaxAnnotate_0() {
+    return runTest(
+      "Arithmetic_SyntaxAnnotate__Test_0.txt"
+     ,"program(expression(INT(3) operator(+) INT(5)))"
+     );
+  }
+
+  public static boolean Arithmetic_SyntaxAnnotate_1() {
+    return runTest(
+      "Arithmetic_SyntaxAnnotate__Test_1.txt"
+      ,"program(expression(INT(3) operator(+) INT(5)))"
+   );
+  }
+
+  public static boolean Arithmetic_SyntaxAnnotate_2() {
+    return runTest(
+      "Arithmetic_SyntaxAnnotate__Test_2.txt" 
+      ,"program(expression(INT(2) operator(*) (expression(INT(3) operator(+) INT(4)))))"
+      );
+  }
+
+  public static boolean Arithmetic_SyntaxAnnotate_3() {
+    return runTest(
+      "Arithmetic_SyntaxAnnotate__Test_3.txt" 
+      ,"program(expression(INT(10) operator(/) INT(2)))"
+      );
+  }
+
+  public static boolean Arithmetic_SyntaxAnnotate_4() {
+    return runTest(
+      "Arithmetic_SyntaxAnnotate__Test_4.txt" 
+      ,"program(expression(INT(3) operator(+) expression(INT(5) operator(*) (expression(INT(10) operator(-) INT(4))))))"
+      );
+  }
+
+  private static boolean runTest(String filename ,String expectedOutput) {
+    try {
+      String input = Files.readString(Paths.get(filename));
+      String actualOutput = runSyntaxAnnotate(input);
+      return expectedOutput.equals(actualOutput);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return false;
+    }
+  }
+
+  private static String runSyntaxAnnotate(String input) throws Exception {
+    Lexer lexer = new ArithmeticLexer(CharStreams.fromString(input));
+    CommonTokenStream tokens = new CommonTokenStream(lexer);
+    ArithmeticParser parser = new ArithmeticParser(tokens);
+    ParseTree tree = parser.program(); // Directly calling the start rule method
+
+    Arithmetic_SyntaxAnnotate_PrintVisitor visitor = new Arithmetic_SyntaxAnnotate_PrintVisitor(parser.getRuleNames() ,false);
+    return visitor.visit(tree);
+  }
+
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE = 
+    "Usage: Arithmetic_SyntaxAnnotate__Test [-version]";
+
+  public static void main(String[] args) {
+    // if (args.length == 0) {
+    //   System.err.println(USAGE_MESSAGE);
+    //   System.exit(1);
+    // }
+    boolean error = false;
+    boolean version = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }        
+    }
+    if (argList.size() != 0) {
+      System.err.println("This program takes no arguments.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    // Use LinkedHashMap to maintain order of test results
+    Map<String, Boolean> tests = new LinkedHashMap<>();
+    tests.put("Arithmetic_SyntaxAnnotate_0", Arithmetic_SyntaxAnnotate_0());
+    tests.put("Arithmetic_SyntaxAnnotate_1", Arithmetic_SyntaxAnnotate_1());
+    tests.put("Arithmetic_SyntaxAnnotate_2", Arithmetic_SyntaxAnnotate_2());
+    tests.put("Arithmetic_SyntaxAnnotate_3", Arithmetic_SyntaxAnnotate_3());
+    tests.put("Arithmetic_SyntaxAnnotate_4", Arithmetic_SyntaxAnnotate_4());
+
+    TestBench.runTests(tests);
+  }
+
+}
+
diff --git a/developer/javac/primary/RuleNameList.java b/developer/javac/primary/RuleNameList.java
new file mode 100644 (file)
index 0000000..c9b727c
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+  Accepts an grammar name (not a file path or file name) and outputs the rule
+  names found in the grammar.  
+
+  RuleNameList does not run antlr to build the grammar files, that must have
+  been done separately before this program is run.
+
+  RuleNameList produces a more reliable list than does RuleNameListRegx.
+
+  RuleNameList does not output terminal symbols (the lexer tokens).
+
+  Usage: ANTLRv4_RuleNames <input-file>
+*/
+
+import org.antlr.v4.runtime.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RuleNameList {
+
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE =
+    "Usage: RuleNameList"
+    +" [-version]"
+    +" [-rule (default)] [-no-rule]"
+    +" [-token] [-no-token (default)]"
+    +" <grammar-name>"
+    ;
+
+  public static void main(String[] args) {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    boolean printRules = true;
+    boolean printTokens = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        case "-rule":
+          printRules = true;
+          break;
+        case "-no-rule":
+          printRules = false;
+          break;
+        case "-token":
+          printTokens = true;
+          break;
+        case "-no-token":
+          printTokens = false;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }        
+    }
+    if (argList.size() != 1) {
+      System.err.println("Expected exactly one non-option argument.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String grammarName = argList.get(0);
+    // in case the user provided a path instead of a name:
+    grammarName = Paths.get(grammarName).getFileName().toString().replace(".g4", "");
+
+    try {
+      // Dynamically load the appropriate lexer and parser
+      Class<?> lexerClass = Class.forName(grammarName + "Lexer");
+      Class<?> parserClass = Class.forName(grammarName + "Parser");
+
+      // Create instances of the lexer and parser
+      Lexer lexer = (Lexer) lexerClass.getConstructor(CharStream.class).newInstance(CharStreams.fromString(""));
+      CommonTokenStream tokens = new CommonTokenStream(lexer);
+      Parser parser = (Parser) parserClass.getConstructor(TokenStream.class).newInstance(tokens);
+
+      // Get the rule names from the parser
+      List<String> ruleNames = List.of(parser.getRuleNames());
+
+      // Get the token names from the lexer
+      List<String> tokenNames = List.of(lexer.getTokenNames());
+
+      // Print the rule names if requested
+      if (printRules) {
+        if (printTokens) {
+          System.out.println("#----------------------------------------");
+          System.out.println("# Rule names found in the grammar:");
+        }
+        for (String ruleName : ruleNames) {
+          System.out.println(ruleName);
+        }
+      }
+
+      // Print the token names if requested
+      if (printTokens) {
+        if (printRules) {
+          System.out.println("#----------------------------------------");
+          System.out.println("# Token names found in the grammar:");
+        }
+        for (String tokenName : tokenNames) {
+          System.out.println(tokenName);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/developer/javac/primary/RuleNameListRegx.java b/developer/javac/primary/RuleNameListRegx.java
new file mode 100644 (file)
index 0000000..36ffb2b
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+Directly reads an ANTLR grammar file, a `.g4` file, and lists all the rules found in it.
+
+*/
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RuleNameListRegx {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE =
+    "Usage: RuleNameListRegx [-version] <path-to-g4-file>";
+
+  public static void main(String[] args) {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    boolean pretty_print = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        case "-pp":
+          pretty_print = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }
+    }
+    if (argList.size() != 1) {
+      System.err.println("Expected exactly one non-option argument.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String filePath = argList.get(0);
+
+    try {
+      Set<String> ruleNames = new HashSet<>();
+      BufferedReader br = new BufferedReader(new FileReader(filePath));
+      StringBuilder content = new StringBuilder();
+      String line;
+      while ((line = br.readLine()) != null) {
+        content.append(line).append("\n");
+      }
+
+      // Updated pattern to handle multi-line rules
+      Pattern rulePattern = Pattern.compile("(?m)^\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*:");
+
+      Matcher matcher = rulePattern.matcher(content.toString());
+      while (matcher.find()) {
+        ruleNames.add(matcher.group(1));
+      }
+
+      System.out.println("Extracted Rules:");
+      for (String rule : ruleNames) {
+        System.out.println(rule);
+      }
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/developer/javac/primary/StringUtils.java b/developer/javac/primary/StringUtils.java
new file mode 100644 (file)
index 0000000..774e253
--- /dev/null
@@ -0,0 +1,18 @@
+public class StringUtils {
+
+    private static int spacesPerIndentLevel = 2; // Default to 2 spaces per indent level
+
+    public static void setSpacesPerIndentLevel(int spaces) {
+        spacesPerIndentLevel = spaces;
+    }
+
+    public static String indentString(String template, int indentLevel) {
+        String indent = " ".repeat(spacesPerIndentLevel * indentLevel);
+        String[] lines = template.split("\n");
+        StringBuilder indentedTemplate = new StringBuilder();
+        for (String line : lines) {
+            indentedTemplate.append(indent).append(line).append("\n");
+        }
+        return indentedTemplate.toString();
+    }
+}
diff --git a/developer/javac/primary/Synthesize_SyntaxAnnotate.java b/developer/javac/primary/Synthesize_SyntaxAnnotate.java
new file mode 100644 (file)
index 0000000..6f002f1
--- /dev/null
@@ -0,0 +1,166 @@
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Synthesize_SyntaxAnnotate {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE = 
+    "Usage: Synthesize_SyntaxAnnotate [-version] <grammar-name> <output-file-path>";
+
+  public static void main(String[] args) throws IOException {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }        
+    }
+    if (argList.size() != 2) {
+      System.err.println("Expected exactly two non-option arguments.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String grammarName = argList.get(0);
+    // in case the user provided a path instead of a name:
+    grammarName = Paths.get(grammarName).getFileName().toString().replace(".g4", "");
+
+    String outputFile = argList.get(1);
+
+    synthesizeSyntaxAnnotateClass(grammarName, outputFile);
+  }
+
+  private static void synthesizeSyntaxAnnotateClass(String grammarName, String outputFile) throws IOException {
+    String className = grammarName + "_SyntaxAnnotate";
+    String lexerName = grammarName + "Lexer";
+    String parserName = grammarName + "Parser";
+    String visitorName = grammarName + "_SyntaxAnnotate_PrintVisitor";
+
+    // Template for the SyntaxAnnotate class
+    String classTemplate = """
+      /* This file generated by Synthesize_SyntaxAnnotate given the grammar 
+         name: ____4_.
+         
+         SyntaxAnnotate programs accept a source file, then echo the source file with
+         syntax annotation. Synthesize_SyntaxAnnotate produces a SyntaxAnnotate program
+         for a specific grammar.
+       */
+      import org.antlr.v4.runtime.*;
+      import org.antlr.v4.runtime.tree.*;
+      import java.io.IOException;
+      import java.nio.file.Files;
+      import java.nio.file.Paths;
+      import java.util.ArrayList;
+      import java.util.List;
+
+      public class ____0_ {
+        // Constant for the usage message
+        private static final String USAGE_MESSAGE =
+          "Usage: ____0_ [-version] [-pp] <source-file-path>";
+
+        public static void main(String[] args) throws IOException {
+          if (args.length == 0) {
+            System.err.println(USAGE_MESSAGE);
+            System.exit(1);
+          }
+          boolean error = false;
+          boolean version = false;
+          boolean pretty_print = false;
+          List<String> argList = new ArrayList<>();
+          for (int i = 0; i < args.length; i++) {
+            String arg = args[i];
+            if (arg.startsWith("-")) {
+              switch (arg) {
+              case "-version":
+                version = true;
+                break;
+              case "-pp":
+                pretty_print = true;
+                break;
+              default:
+                System.err.println("Unrecognized option: " + arg);
+                error = true;
+              }
+            } else {
+              argList.add(arg);
+            }
+          }
+          if(version){
+            System.out.println("version 0.1");
+            if(error){
+              System.exit(1);
+            }else{
+              System.exit(0);
+            }        
+          }
+          if (argList.size() != 1) {
+            System.err.println("Expected exactly one non-option argument.");
+            error = true;
+          }
+          if(error){
+            System.err.println(USAGE_MESSAGE);
+            System.exit(1);
+          }
+
+          String input_file = argList.get(0);
+          String input = Files.readString(Paths.get(input_file));
+
+          try {
+            ____1_ lexer = new ____1_(CharStreams.fromString(input));
+            CommonTokenStream tokens = new CommonTokenStream(lexer);
+            ____2_ parser = new ____2_(tokens);
+            ParseTree tree = parser.program();
+
+            ____3_ visitor = new ____3_(parser.getRuleNames(), pretty_print);
+            String output = visitor.visit(tree);
+            System.out.println(output);
+          } catch (Exception e) {
+            e.printStackTrace();
+          }
+        }
+      }
+      """;
+
+    // Fill in the blanks in the template
+    classTemplate = classTemplate.replace("____0_", className);
+    classTemplate = classTemplate.replace("____1_", lexerName);
+    classTemplate = classTemplate.replace("____2_", parserName);
+    classTemplate = classTemplate.replace("____3_", visitorName);
+    classTemplate = classTemplate.replace("____4_", grammarName);
+
+    // Write the synthesized class to the output file
+    Files.writeString(Paths.get(outputFile), classTemplate);
+  }
+}
+
+//  LocalWords:  SyntaxAnnotate
diff --git a/developer/javac/primary/Synthesize_SyntaxAnnotate_PrintVisitor.java b/developer/javac/primary/Synthesize_SyntaxAnnotate_PrintVisitor.java
new file mode 100644 (file)
index 0000000..ae508b0
--- /dev/null
@@ -0,0 +1,117 @@
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+import java.io.PrintWriter;
+
+public class Synthesize_SyntaxAnnotate_PrintVisitor {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE = 
+    "Usage: Synthesize_SyntaxAnnotate_PrintVisitor"
+    +" [-version]"
+    +" <g4-grammar-file-path> <outputFile> [indent-level (default 0)]"
+    ;
+
+  public static void main(String[] args) throws IOException {
+  if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    int indentLevel = 0;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if (version) {
+      System.out.println("Version 0.1");
+      if (error) {
+        System.exit(1);
+      } else {
+        System.exit(0);
+      }
+    }
+    if (argList.size() < 2 || argList.size() > 3) {
+      System.err.println("Expected two or three non-option arguments.");
+      error = true;
+    }
+    if (error) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String grammarFilePath = argList.get(0);
+    String outputFile      = argList.get(1);
+    if (argList.size() == 3) {
+      indentLevel = Integer.parseInt(argList.get(2));
+    }
+
+    String grammarName = Paths.get(grammarFilePath).getFileName().toString().replace(".g4", "");
+    String parserName = grammarName + "Parser";
+    String visitorClassName = grammarName + "_SyntaxAnnotate_PrintVisitor";
+
+    // Parse the .g4 file
+    CharStream input = CharStreams.fromFileName(grammarFilePath);
+    ANTLRv4Lexer lexer = new ANTLRv4Lexer(input);
+    CommonTokenStream tokens = new CommonTokenStream(lexer);
+    ANTLRv4Parser parser = new ANTLRv4Parser(tokens);
+
+    // Extract rules
+    ParseTree tree = parser.grammarSpec();
+    List<String> ruleNames = extractRuleNames(parser);
+
+    // Synthesize the print methods
+    StringBuilder printMethods = new StringBuilder();
+    for (String ruleName : ruleNames) {
+      printMethods.append(Synthesize_SyntaxAnnotate_PrintVisitorMethod.synthesizePrintMethod(parserName, ruleName, indentLevel + 1));
+    }
+
+    // Template for the PrintVisitor class
+    String classTemplate = """
+      /* This file synthesized by Synthesize_SyntaxAnnotate_PrintVisitor.
+      */
+      import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
+
+      public class ____0_ extends AbstractParseTreeVisitor<String> {
+        private final String[] ruleNames;
+
+        public ____0_(String[] ruleNames) {
+          this.ruleNames = ruleNames;
+        }
+
+        ____1_
+      }
+      """;
+
+    classTemplate = classTemplate.replace("____0_", visitorClassName);
+    classTemplate = classTemplate.replace("____1_", printMethods.toString());
+
+    try (PrintWriter writer = new PrintWriter(outputFile)) {
+      writer.print(classTemplate);
+    }
+  }
+
+  private static List<String> extractRuleNames(Parser parser) {
+    // Extract rule names from the parser
+    return Arrays.asList(parser.getRuleNames());
+  }
+}
+
+//  LocalWords:  SyntaxAnnotate PrintVisitor
diff --git a/developer/javac/primary/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java b/developer/javac/primary/Synthesize_SyntaxAnnotate_PrintVisitorMethod.java
new file mode 100644 (file)
index 0000000..35394bb
--- /dev/null
@@ -0,0 +1,90 @@
+import java.util.ArrayList;
+import java.util.List;
+import java.io.PrintWriter;
+
+public class Synthesize_SyntaxAnnotate_PrintVisitorMethod {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE = 
+    "Usage: Synthesize_SyntaxAnnotate_PrintVisitorMethod"
+    + " [-version]"
+    +" <grammar-name> <g4-rule-name> <output-file>"
+    ;
+
+  public static void main(String[] args) {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }        
+    }
+    if (argList.size() != 3) {
+      System.err.println("Expected exactly three non-option arguments.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String grammarName = argList.get(0);
+    String ruleName    = argList.get(1);
+    String outputFile  = argList.get(2);
+
+    String parserName = grammarName + "Parser";
+    
+    try {
+      PrintWriter writer = new PrintWriter(outputFile);
+      // start at indent level 0
+      writer.print(synthesizePrintMethod(parserName, ruleName, 0)); 
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  public static String synthesizePrintMethod(String parserName, String ruleName, int indentLevel) {
+    // Template for the print method using text blocks
+    String template = """
+      public String visit____0_ (____1_.____0_Context ctx) {
+        StringBuilder result = new StringBuilder();
+        result.append("____0_(");
+        for (int i = 0; i < ctx.getChildCount(); i++) {
+          if (i > 0) result.append(", ");
+          result.append(visit(ctx.getChild(i)));
+        }
+        result.append(")");
+        return result.toString();
+      }
+      """;
+
+    // Fill in the blanks in the template
+    template = template.replace("____0_", ruleName);
+    template = template.replace("____1_", parserName);
+
+    // Indent the template
+    return StringUtils.indentString(template, indentLevel);
+  }
+}
diff --git a/developer/javac/primary/TestBench.java b/developer/javac/primary/TestBench.java
new file mode 100644 (file)
index 0000000..8bdcc67
--- /dev/null
@@ -0,0 +1,28 @@
+import java.util.Map;
+
+public class TestBench {
+
+    public static void runTests(Map<String, Boolean> tests) {
+        int totalTests = tests.size();
+        int passedTests = 0;
+        int failedTests = 0;
+
+        for (Map.Entry<String, Boolean> test : tests.entrySet()) {
+            try {
+                if (test.getValue()) {
+                    passedTests++;
+                } else {
+                    System.out.println("failed: " + test.getKey());
+                    failedTests++;
+                }
+            } catch (Exception e) {
+                System.out.println("failed: " + test.getKey());
+                failedTests++;
+            }
+        }
+
+        System.out.println("Total tests run: " + totalTests);
+        System.out.println("Total tests passed: " + passedTests);
+        System.out.println("Total tests failed: " + failedTests);
+    }
+}
diff --git a/developer/javac/synthesized/Arithmetic2_SyntaxAnnotate.java b/developer/javac/synthesized/Arithmetic2_SyntaxAnnotate.java
new file mode 100644 (file)
index 0000000..c4577ca
--- /dev/null
@@ -0,0 +1,81 @@
+/* This file generated by Synthesize_SyntaxAnnotate given the grammar
+   name: Arithmetic2.
+
+   SyntaxAnnotate programs accept a source file, then echo the source file with
+   syntax annotation. Synthesize_SyntaxAnnotate produces a SyntaxAnnotate program
+   for a specific grammar.
+ */
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.tree.*;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Arithmetic2_SyntaxAnnotate {
+  // Constant for the usage message
+  private static final String USAGE_MESSAGE =
+    "Usage: Arithmetic2_SyntaxAnnotate [-version] [-pp] <source-file-path>";
+
+  public static void main(String[] args) throws IOException {
+    if (args.length == 0) {
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+    boolean error = false;
+    boolean version = false;
+    boolean pretty_print = false;
+    List<String> argList = new ArrayList<>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if (arg.startsWith("-")) {
+        switch (arg) {
+        case "-version":
+          version = true;
+          break;
+        case "-pp":
+          pretty_print = true;
+          break;
+        default:
+          System.err.println("Unrecognized option: " + arg);
+          error = true;
+        }
+      } else {
+        argList.add(arg);
+      }
+    }
+    if(version){
+      System.out.println("version 0.1");
+      if(error){
+        System.exit(1);
+      }else{
+        System.exit(0);
+      }
+    }
+    if (argList.size() != 1) {
+      System.err.println("Expected exactly one non-option argument.");
+      error = true;
+    }
+    if(error){
+      System.err.println(USAGE_MESSAGE);
+      System.exit(1);
+    }
+
+    String input_file = argList.get(0);
+    String input = Files.readString(Paths.get(input_file));
+
+    try {
+      Arithmetic2Lexer lexer = new Arithmetic2Lexer(CharStreams.fromString(input));
+      CommonTokenStream tokens = new CommonTokenStream(lexer);
+      Arithmetic2Parser parser = new Arithmetic2Parser(tokens);
+      ParseTree tree = parser.program();
+
+      Arithmetic2_SyntaxAnnotate_PrintVisitor visitor = new Arithmetic2_SyntaxAnnotate_PrintVisitor(parser.getRuleNames(), pretty_print);
+      String output = visitor.visit(tree);
+      System.out.println(output);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/developer/javac/synthesized/Arithmetic2_SyntaxAnnotate_PrintVisitor.java b/developer/javac/synthesized/Arithmetic2_SyntaxAnnotate_PrintVisitor.java
new file mode 100644 (file)
index 0000000..28a4866
--- /dev/null
@@ -0,0 +1,663 @@
+/* This file synthesized by Synthesize_SyntaxAnnotate_PrintVisitor.
+*/
+import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
+
+public class Arithmetic2_SyntaxAnnotate_PrintVisitor extends AbstractParseTreeVisitor<String> {
+  private final String[] ruleNames;
+
+  public Arithmetic2_SyntaxAnnotate_PrintVisitor(String[] ruleNames) {
+    this.ruleNames = ruleNames;
+  }
+
+    public String visitgrammarSpec (Arithmetic2Parser.grammarSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("grammarSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitgrammarDecl (Arithmetic2Parser.grammarDeclContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("grammarDecl(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitgrammarType (Arithmetic2Parser.grammarTypeContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("grammarType(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitprequelConstruct (Arithmetic2Parser.prequelConstructContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("prequelConstruct(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitoptionsSpec (Arithmetic2Parser.optionsSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("optionsSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitoption (Arithmetic2Parser.optionContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("option(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitoptionValue (Arithmetic2Parser.optionValueContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("optionValue(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitdelegateGrammars (Arithmetic2Parser.delegateGrammarsContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("delegateGrammars(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitdelegateGrammar (Arithmetic2Parser.delegateGrammarContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("delegateGrammar(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visittokensSpec (Arithmetic2Parser.tokensSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("tokensSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitchannelsSpec (Arithmetic2Parser.channelsSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("channelsSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitidList (Arithmetic2Parser.idListContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("idList(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitaction_ (Arithmetic2Parser.action_Context ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("action_(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitactionScopeName (Arithmetic2Parser.actionScopeNameContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("actionScopeName(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitactionBlock (Arithmetic2Parser.actionBlockContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("actionBlock(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitargActionBlock (Arithmetic2Parser.argActionBlockContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("argActionBlock(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitmodeSpec (Arithmetic2Parser.modeSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("modeSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitrules (Arithmetic2Parser.rulesContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("rules(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleSpec (Arithmetic2Parser.ruleSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitparserRuleSpec (Arithmetic2Parser.parserRuleSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("parserRuleSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitexceptionGroup (Arithmetic2Parser.exceptionGroupContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("exceptionGroup(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitexceptionHandler (Arithmetic2Parser.exceptionHandlerContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("exceptionHandler(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitfinallyClause (Arithmetic2Parser.finallyClauseContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("finallyClause(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitrulePrequel (Arithmetic2Parser.rulePrequelContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("rulePrequel(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleReturns (Arithmetic2Parser.ruleReturnsContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleReturns(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitthrowsSpec (Arithmetic2Parser.throwsSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("throwsSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlocalsSpec (Arithmetic2Parser.localsSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("localsSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleAction (Arithmetic2Parser.ruleActionContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleAction(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleModifiers (Arithmetic2Parser.ruleModifiersContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleModifiers(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleModifier (Arithmetic2Parser.ruleModifierContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleModifier(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleBlock (Arithmetic2Parser.ruleBlockContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleBlock(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleAltList (Arithmetic2Parser.ruleAltListContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleAltList(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlabeledAlt (Arithmetic2Parser.labeledAltContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("labeledAlt(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerRuleSpec (Arithmetic2Parser.lexerRuleSpecContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerRuleSpec(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerRuleBlock (Arithmetic2Parser.lexerRuleBlockContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerRuleBlock(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerAltList (Arithmetic2Parser.lexerAltListContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerAltList(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerAlt (Arithmetic2Parser.lexerAltContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerAlt(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerElements (Arithmetic2Parser.lexerElementsContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerElements(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerElement (Arithmetic2Parser.lexerElementContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerElement(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerBlock (Arithmetic2Parser.lexerBlockContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerBlock(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerCommands (Arithmetic2Parser.lexerCommandsContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerCommands(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerCommand (Arithmetic2Parser.lexerCommandContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerCommand(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerCommandName (Arithmetic2Parser.lexerCommandNameContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerCommandName(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerCommandExpr (Arithmetic2Parser.lexerCommandExprContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerCommandExpr(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitaltList (Arithmetic2Parser.altListContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("altList(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitalternative (Arithmetic2Parser.alternativeContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("alternative(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitelement (Arithmetic2Parser.elementContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("element(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitpredicateOptions (Arithmetic2Parser.predicateOptionsContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("predicateOptions(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitpredicateOption (Arithmetic2Parser.predicateOptionContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("predicateOption(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlabeledElement (Arithmetic2Parser.labeledElementContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("labeledElement(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitebnf (Arithmetic2Parser.ebnfContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ebnf(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitblockSuffix (Arithmetic2Parser.blockSuffixContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("blockSuffix(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitebnfSuffix (Arithmetic2Parser.ebnfSuffixContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ebnfSuffix(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitlexerAtom (Arithmetic2Parser.lexerAtomContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("lexerAtom(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitatom (Arithmetic2Parser.atomContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("atom(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitnotSet (Arithmetic2Parser.notSetContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("notSet(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitblockSet (Arithmetic2Parser.blockSetContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("blockSet(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitsetElement (Arithmetic2Parser.setElementContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("setElement(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitblock (Arithmetic2Parser.blockContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("block(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitruleref (Arithmetic2Parser.rulerefContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("ruleref(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitcharacterRange (Arithmetic2Parser.characterRangeContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("characterRange(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitterminalDef (Arithmetic2Parser.terminalDefContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("terminalDef(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitelementOptions (Arithmetic2Parser.elementOptionsContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("elementOptions(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitelementOption (Arithmetic2Parser.elementOptionContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("elementOption(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+  public String visitidentifier (Arithmetic2Parser.identifierContext ctx) {
+    StringBuilder result = new StringBuilder();
+    result.append("identifier(");
+    for (int i = 0; i < ctx.getChildCount(); i++) {
+      if (i > 0) result.append(", ");
+      result.append(visit(ctx.getChild(i)));
+    }
+    result.append(")");
+    return result.toString();
+  }
+
+}
diff --git a/developer/ologist/#emacs.txt# b/developer/ologist/#emacs.txt#
new file mode 100644 (file)
index 0000000..7eaf367
--- /dev/null
@@ -0,0 +1,30 @@
+
+
+antlr-mode.el -> .emacs.d
+(autoload 'antlr-mode "antlr-mode" "Major mode for editing ANTLR grammars." t)
+(add-to-list 'auto-mode-alist '("\\.g4\\'" . antlr-mode))
+
+un M-x package-install gradle-mode.
+(require 'gradle-mode)
+(gradle-mode 1)
+
+C-c C-g b to run gradle build
+C-c C-g t to run gradle test
+C-c C-g s to run a single test
+C-c C-g d to run a Gradle command with the daemon
+
+Run M-x package-install RET groovy-mode RET.
+(require 'groovy-mode)
+(add-to-list 'auto-mode-alist '("\\.gradle\\'" . groovy-mode))
+
+(electric-indent-mode 1)
+Run M-x package-install RET auto-indent-mode RET.
+
+(require 'auto-indent-mode)
+(auto-indent-global-mode)
+
+
+(defun my-groovy-mode-hook ()
+  (setq groovy-indent-offset 2))  ;; Set indentation level to 2 spaces
+
+(add-hook 'groovy-mode-hook 'my-groovy-mode-hook)
\ No newline at end of file
index d296f71..c7b6404 100644 (file)
@@ -1,3 +1,24 @@
+
+
 antlr-mode.el -> .emacs.d
 (autoload 'antlr-mode "antlr-mode" "Major mode for editing ANTLR grammars." t)
 (add-to-list 'auto-mode-alist '("\\.g4\\'" . antlr-mode))
+
+un M-x package-install gradle-mode.
+(require 'gradle-mode)
+(gradle-mode 1)
+
+C-c C-g b to run gradle build
+C-c C-g t to run gradle test
+C-c C-g s to run a single test
+C-c C-g d to run a Gradle command with the daemon
+
+Run M-x package-install RET groovy-mode RET.
+(require 'groovy-mode)
+(add-to-list 'auto-mode-alist '("\\.gradle\\'" . groovy-mode))
+
+(electric-indent-mode 1)
+Run M-x package-install RET auto-indent-mode RET.
+
+(require 'auto-indent-mode)
+(auto-indent-global-mode)
index c326b81..20983a4 100644 (file)
@@ -12,11 +12,22 @@ if [ -z "$REPO_HOME" ]; then
   source "${script_path}/env_base"
 fi
 
+export DEVELOPER_HOME="$REPO_HOME/developer"
+
 export JAVA_HOME="$REPO_HOME/tool/jdk-22.0.1+8"
+export GRADLE_HOME="$REPO_HOME/tool/gradle-8.10-rc-1"
 export ANTLR_JAR="$REPO_HOME/tool/executor/antlr-4.11.1-complete.jar"
-export DEVELOPER_HOME="$REPO_HOME/developer"
 
-export PATH="$DEVELOPER_HOME"/executor:"$REPO_HOME"/tool/executor:"$JAVA_HOME"/bin:"$PATH"
+export PATH=\
+"$DEVELOPER_HOME"/executor\
+:"$REPO_HOME"/tool/executor\
+:"$JAVA_HOME"/bin\
+:"$GRADLE_HOME"/bin\
+:"$PATH"
+
+export GRADLE_OPTS="--settings-file $REPO_HOME/settings.gradle"
+
+
 cd "$DEVELOPER_HOME"
 
 # This is helpful so that cut and paste from the makefile to the shell can be used for testing.
@@ -24,3 +35,5 @@ cd "$DEVELOPER_HOME"
 source "$DEVELOPER_HOME"/executor/env_build
 
 echo "${BASH_SOURCE[0]}" "complete"
+
+#  LocalWords:  gradle antlr jdk REPO
index 3720ce6..005f7c6 100755 (executable)
@@ -14,3 +14,11 @@ fi
 ln -sfn "$REPO_HOME/tool/executor" "$REPO_HOME/tool/bin"
 
 echo "All installations complete. Java and ANTLR have been installed successfully."
+
+# https://gradle.org/install/
+# export PATH=$PATH:../gradle-8.10/bin
+#
+# gradle download: https://services.gradle.org/distributions/ -> tool/upstream
+# cd tool
+# unzip -d . upstream/gradle-8.10-rc-1-all.zip 
+# export PATH=$PATH:../gradle-8.10/bin -> env_dev
index 8755bcb..36d4e9f 100644 (file)
@@ -100,6 +100,60 @@ coordinating with other team members who want hidden files. Hence, a general
 solution that solves all these issues is to alias `ls` to `ls -a`, which is done
 in the environment initialization file for the project.
 
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+
+Each project has a virtual environment.  So, for the GQL project, gradle is
+installed under .../GQL_to_Cypher/tools.  `gradle` is found under
+`..GQL_to_Cypher/tool/gradle-8.10-rc-1/bin/` and the `env_dev` script sets the
+paths to make it accessible (analogous to Python virtual environment
+`activate`).
+
+`.git` is under the `.../GQL_to_Cypher` directory, so the 'project' directory is
+`.../GQL_to_Cypher`.
+
+All development is done under `.../GQL_to_Cypher/developer` directory.  There
+are no files under that directory, instead all files go into subdirectories.
+The current (being replaced) makefile is under
+`.../GQL_to_Cypher/devloper/executor` There is a bash script that is found first
+in the path that wraps the call to `make` and provides customizing options.
+
+Where does the `settings.gradle` file go?  Where does the `build.gradle` file
+go?  Perhaps `gradle` will also need a script that provides options to wrap the
+`gradle` call?
+
+-->
+
+GQL_to_Cypher/
+├── settings.gradle
+├── build.gradle
+├── developer/
+│   ├── executor/
+│   │   ├── build.gradle
+│   │   └── other-subdirectories/
+│   └── other-subdirectories/
+├── tools/
+│   └── gradle-8.10-rc-1/
+│       └── bin/
+└── other-directories/
+
+
+--->
+
+gradle-wrapper.sh
+
+#!/usr/bin/env bash
+
+# Source the environment setup script
+source .../GQL_to_Cypher/tools/env_dev  # this should probably be env_build
+
+# Call gradle with any additional options
+.../GQL_to_Cypher/tools/gradle-8.10-rc-1/bin/gradle "$@"
+
+./gradle-wrapper.sh build
+
+
 
 <!--  LocalWords:  lector
  -->
diff --git a/settings.gradle b/settings.gradle
new file mode 100644 (file)
index 0000000..bd233ed
--- /dev/null
@@ -0,0 +1,3 @@
+
+rootProject.name = 'GQL_to_Cypher'
+