deletes the regexp based grammar tokens separator, to be replaced by parsing grammar...
authorThomas Walker Lynch <xtujpz@reasoningtechnology.com>
Tue, 3 Sep 2024 06:52:14 +0000 (06:52 +0000)
committerThomas Walker Lynch <xtujpz@reasoningtechnology.com>
Tue, 3 Sep 2024 06:52:14 +0000 (06:52 +0000)
developer/executor/ANTLR_OUT_FL [new file with mode: 0755]
developer/executor/GrammarSplitter [deleted file]
developer/executor/TerminalToCategory [deleted file]
developer/executor/env_build
developer/executor/makefile
developer/executor/makefile-project [new file with mode: 0644]
developer/executor/makefile-tool [new file with mode: 0644]
developer/javac/ANTLR_OUT_FL.java [new file with mode: 0644]
developer/javac/PrintRuleNameList.java [deleted file]
developer/javac/PrintRuleNameListRegx.java [new file with mode: 0644]
developer/test/combined_output.txt [deleted file]

diff --git a/developer/executor/ANTLR_OUT_FL b/developer/executor/ANTLR_OUT_FL
new file mode 100755 (executable)
index 0000000..bc88289
--- /dev/null
@@ -0,0 +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/developer/jvm/ANTLR_OUT_FL.jar ANTLR_OUT_FL $@
diff --git a/developer/executor/GrammarSplitter b/developer/executor/GrammarSplitter
deleted file mode 100755 (executable)
index c1e8c25..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/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/developer/jvm/GrammarSplitter.jar GrammarSplitter $@
diff --git a/developer/executor/TerminalToCategory b/developer/executor/TerminalToCategory
deleted file mode 100755 (executable)
index 0cc5d60..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/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/developer/jvm/TerminalToCategory.jar TerminalToCategory $@
index a77a618..fa99ac5 100755 (executable)
@@ -95,25 +95,27 @@ if [ -z "${ANTLR_IN_PRIMARY_FPL}" ]; then
   echo "No ANTLR input grammar files found"
 fi
 
+# replaced with a tool called ANTLR_OUR_FL
+#
 # This function accepts a grammar name, or a grammar name with an extension; 
 # and sets a variable of the form ANTLR_OUT_<grammar>_FPL to a list of
 # files that ANTLR would produce for <grammar>.
-set_ANTLR_out_fpl_var() {
-  local grammar=$1
-  export ANTLR_OUT_${grammar}_FPL="${ANTLR_OUT_DIR}/${grammar}Lexer.java ${ANTLR_OUT_DIR}/${grammar}Parser.java ${ANTLR_OUT_DIR}/${grammar}BaseVisitor.java ${ANTLR_OUT_DIR}/${grammar}Visitor.java"
-}
+set_ANTLR_out_fpl_var() {
+#  local grammar=$1
+#  export ANTLR_OUT_${grammar}_FPL="${ANTLR_OUT_DIR}/${grammar}Lexer.java ${ANTLR_OUT_DIR}/${grammar}Parser.java ${ANTLR_OUT_DIR}/${grammar}BaseVisitor.java ${ANTLR_OUT_DIR}/${grammar}Visitor.java"
+}
 
 # Generate ANTLR_OUT_<grammar>_FPL for each grammar
-for grammar in ${ANTLR_GRAMMAR_LIST}; do
-  set_ANTLR_out_fpl_var ${grammar}
-done
+for grammar in ${ANTLR_GRAMMAR_LIST}; do
+#  set_ANTLR_out_fpl_var ${grammar}
+done
 
 # Combine all individual file lists into ANTLR_OUT_FPL
-ANTLR_OUT_FPL=""
-for grammar in ${ANTLR_GRAMMAR_LIST}; do
-  ANTLR_OUT_FPL="${ANTLR_OUT_FPL} $(eval echo \$ANTLR_OUT_${grammar}_FPL)"
-done
-export ANTLR_OUT_FPL
+ANTLR_OUT_FPL=""
+for grammar in ${ANTLR_GRAMMAR_LIST}; do
+  ANTLR_OUT_FPL="${ANTLR_OUT_FPL} $(eval echo \$ANTLR_OUT_${grammar}_FPL)"
+done
+export ANTLR_OUT_FPL
 
 #--------------------------------------------------------------------------------
 # Java files 
index 4a82e3b..d5b6644 100644 (file)
@@ -1,72 +1,9 @@
-#================================================================================
-# Custom make targets
-#
+# Top level makefile assures we do setup, tools, and project build in correct order.
 
-all: setup $(EXECUTOR_IN_FPL)
+.PHONY: all setup tools project
 
-
-PrintRuleNameList: $(EXECUTOR_IN_DIR)/PrintRuleNameList
-
-Arithmetic_Echo: $(ANTLR_OUT_Arithmetic_FPL) $(JAVAC_D)/Arithmetic_Echo_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       make $(EXECUTOR_IN_DIR)/Arithmetic_Echo
-
-Arithmetic_Echo__Test: $(ANTLR_OUT_Arithmetic_FPL) $(JAVAC_D)/Arithmetic_Echo_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       make $(EXECUTOR_IN_DIR)/Arithmetic_Echo__Test
-
-Arithmetic_Syntax: $(ANTLR_OUT_Arithmetic_FPL) $(JAVAC_D)/Arithmetic_Echo_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       make $(EXECUTOR_IN_DIR)/Arithmetic_Syntax
-
-Arithmetic_Syntax__Test: $(ANTLR_OUT_Arithmetic_FPL) $(JAVAC_D)/Arithmetic_Syntax_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_Arithmetic_FPL)" ]; then \
-         echo "variable ANTLR_OUT_Arithmetic_FPL empty."; \
-         exit 1; \
-       fi
-       make $(EXECUTOR_IN_DIR)/Arithmetic_Syntax__Test
-
-GQL_20240412_Syntax: $(ANTLR_OUT_GQL_20240412_FPL) $(JAVAC_D)/GQL_20240412_Syntax_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
-         echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
-         exit 1; \
-       fi
-       make $(EXECUTOR_IN_DIR)/GQL_20240412_Syntax
-
-GQL_20240412_Syntax__Test: $(ANTLR_OUT_GQL_20240412_FPL) $(JAVAC_D)/GQL_20240412_Syntax_PrintVisitor.java
-       @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
-         echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
-         exit 1; \
-       fi
-       make $(EXECUTOR_IN_DIR)/GQL_20240412_Syntax__Test
-
-TerminalToCategory: 
-       make $(EXECUTOR_IN_DIR)/TerminalToCategory
-
-GrammarSplitter: 
-       make $(EXECUTOR_IN_DIR)/GrammarSplitter
-
-
-
-# make the `.java` files for all grammars
-grammar: setup $(ANTLR_OUT_FPL)
-
-# Specific grammar targets. Run them like this:
-# > make <grammar_name>
-# e.g. > make GQL_test
-$(foreach grammar,$(ANTLR_GRAMMAR_LIST),$(eval $(grammar): $(value ANTLR_OUT_$(grammar)_FPL)))
-
-# Compile all the .java files.
-java: setup $(JAVA_COMP_OUT_FPL)
+# The 'all' target now depends on 'tools' and 'project'
+all: setup tools project
 
 .PHONY: version
 version:
@@ -76,51 +13,15 @@ version:
        @ make -v | head -n 1
        @ echo "makefile 0.4"
 
-.PHONY: setup
-# ANTLR automatically creates $(ANTLR_OUT_DIR)
 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 
 
-# Default clean target
-.PHONY: setup
-clean:
-       @echo "Use the clean script from the $(EXECUTOR_IN_DIR) directory instead of \`make clean\`"
-       @$(EXECUTOR_IN_DIR)/clean
-
-#useful for distinguishing initial make error messages and message generated by rules firing
-nothing:
-       @:
-
-#================================================================================
-# generic targets, aka recipes
-#
-
-$(ANTLR_OUT_DIR)/%Lexer.java \
-$(ANTLR_OUT_DIR)/%Parser.java \
-$(ANTLR_OUT_DIR)/%BaseVisitor.java \
-$(ANTLR_OUT_DIR)/%Visitor.java: $(ANTLR_IN_PRIMARY_FPL)
-       @echo "making grammar from:" $<
-       $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -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 $@"
+# Ensure tools like ANTLR_OUT_FL are built before building the project programs
+tools: setup
+       $(MAKE) -f $(EXECUTOR_IN_DIR)/makefile-tool -$(MAKEFLAGS)
 
-$(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)/$*"
+# Run the project makefile and pass any targets or arguments to it
+PROJECT_GOALS := $(filter-out setup version,$(MAKECMDGOALS))
+project: setup tools
+       $(MAKE) -f $(EXECUTOR_IN_DIR)/makefile-project -$(MAKEFLAGS) $(PROJECT_GOALS)
diff --git a/developer/executor/makefile-project b/developer/executor/makefile-project
new file mode 100644 (file)
index 0000000..0826e62
--- /dev/null
@@ -0,0 +1,117 @@
+#================================================================================
+# Custom make targets
+#
+
+all: $(EXECUTOR_IN_FPL)
+
+PrintRuleNameList: $(EXECUTOR_IN_DIR)/PrintRuleNameList
+
+
+ANTLR_OUT_Arithmetic_FPL := $(shell ANTLR_OUT_FL Arithmetic.g4 -visitor -no-listener)
+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
+       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
+       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
+       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
+       make $(EXECUTOR_IN_DIR)/Arithmetic_Syntax__Test
+
+GQL_20240412_Syntax: $(ANTLR_OUT_GQL_20240412_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_Syntax_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
+         echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
+         exit 1; \
+       fi
+       make $(EXECUTOR_IN_DIR)/GQL_20240412_Syntax
+
+GQL_20240412_Syntax__Test: $(ANTLR_OUT_GQL_20240412_FPL) $(JAVA_COMP_IN_PRIMARY_DIR)/GQL_20240412_Syntax_PrintVisitor.java
+       @if [ -z "$(ANTLR_OUT_GQL_20240412_FPL)" ]; then \
+         echo "variable ANTLR_OUT_GQL_20240412_FPL empty."; \
+         exit 1; \
+       fi
+       make $(EXECUTOR_IN_DIR)/GQL_20240412_Syntax__Test
+
+TerminalToCategory: 
+       make $(EXECUTOR_IN_DIR)/TerminalToCategory
+
+GrammarSplitter: 
+       make $(EXECUTOR_IN_DIR)/GrammarSplitter
+
+
+
+# make the `.java` files for all grammars
+grammar: $(ANTLR_OUT_FPL)
+
+# Specific grammar targets. Run them like this:
+# > make <grammar_name>
+# e.g. > make GQL_test
+$(foreach grammar,$(ANTLR_GRAMMAR_LIST),$(eval $(grammar): $(value ANTLR_OUT_$(grammar)_FPL)))
+
+# Compile all the .java files.
+java: $(JAVA_COMP_OUT_FPL)
+
+# 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 initial make error messages and message generated by rules firing
+nothing:
+       @:
+
+#================================================================================
+# generic targets, aka recipes
+#
+
+$(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:" $<
+       $(JAVA_INTERP) -jar $(ANTLR_JAR) -Dlanguage=Java -visitor -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 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-tool b/developer/executor/makefile-tool
new file mode 100644 (file)
index 0000000..4ee0f48
--- /dev/null
@@ -0,0 +1,35 @@
+#================================================================================
+# Custom make targets
+#
+
+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/javac/ANTLR_OUT_FL.java b/developer/javac/ANTLR_OUT_FL.java
new file mode 100644 (file)
index 0000000..bdd85a3
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+
+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.
+
+The `-visitor` and `no-lsistner` options also affect the output, as they would
+for antlr.
+
+*/
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ANTLR_OUT_FL {
+
+    public static void main(String[] args) {
+        if (args.length == 0) {
+            System.err.println("Usage: java ANTLR_OUT_FL <grammar-file> [-visitor] [-no-listener]");
+            System.exit(1);
+        }
+
+        boolean visitor = false;
+        boolean noListener = false;
+        boolean noTokens = false;
+        List<String> argList = new ArrayList<>();
+
+        // Parse the arguments
+        for (String arg : args) {
+            if (arg.startsWith("-")) {
+                switch (arg) {
+                    case "-visitor":
+                        visitor = true;
+                        break;
+                    case "-no-listener":
+                        noListener = true;
+                        break;
+                    case "-no-tokens":
+                        noTokens = true;
+                        break;
+                    default:
+                        System.err.println("Unrecognized option: " + arg);
+                        System.err.println("Usage: java ANTLR_OUT_FL <grammar-file> [-visitor] [-no-listener]");
+                        System.exit(1);
+                }
+            } else {
+                argList.add(arg);
+            }
+        }
+
+        // Ensure there is exactly one grammar file argument
+        if (argList.size() != 1) {
+            System.err.println("Usage: java ANTLR_OUT_FL <grammar-file> [-visitor] [-no-listener]");
+            System.exit(1);
+        }
+
+        String grammarFile = argList.get(0);
+
+        List<String> generatedFiles = generateFileList(grammarFile, visitor, noListener ,noTokens);
+
+        // 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 grammarFile, boolean visitor, boolean noListener ,boolean noTokens) {
+        String baseName = new File(grammarFile).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(baseName + "Lexer.java");
+            if (!noTokens) fileList.add(baseName + "Lexer.tokens");
+        }
+
+        if (isParser || isCombined) {
+            // Parser files
+            fileList.add(baseName + "Parser.java");
+            if (!noTokens) fileList.add(baseName + ".tokens");
+
+            // Listener-related files
+            if (!noListener) {
+                fileList.add(baseName + "Listener.java");
+                fileList.add(baseName + "BaseListener.java");
+            }
+
+            // Visitor-related files
+            if (visitor) {
+                fileList.add(baseName + "Visitor.java");
+                fileList.add(baseName + "BaseVisitor.java");
+            }
+        }
+
+        return fileList;
+    }
+}
diff --git a/developer/javac/PrintRuleNameList.java b/developer/javac/PrintRuleNameList.java
deleted file mode 100644 (file)
index 6c58e64..0000000
+++ /dev/null
@@ -1,47 +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;
-
-public class PrintRuleNameList {
-
-  public static void main(String[] args) {
-    if (args.length != 1) {
-      System.out.println("Usage: java GrammarRuleExtractor <path-to-g4-file>");
-      return;
-    }
-
-    String filePath = args[0];
-    Set<String> ruleNames = new HashSet<>();
-
-    try (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/PrintRuleNameListRegx.java b/developer/javac/PrintRuleNameListRegx.java
new file mode 100644 (file)
index 0000000..1fb4459
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+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;
+
+public class PrintRuleNameListRegx {
+
+  public static void main(String[] args) {
+    if (args.length != 1) {
+      System.out.println("Usage: java GrammarRuleExtractor <path-to-g4-file>");
+      return;
+    }
+
+    String filePath = args[0];
+    Set<String> ruleNames = new HashSet<>();
+
+    try (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/test/combined_output.txt b/developer/test/combined_output.txt
deleted file mode 100644 (file)
index e69de29..0000000