--- /dev/null
+#!/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 $@
+++ /dev/null
-#!/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 $@
+++ /dev/null
-#!/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 $@
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
-#================================================================================
-# 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:
@ 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)
--- /dev/null
+#================================================================================
+# 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)/$*"
--- /dev/null
+#================================================================================
+# 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)/$*"
--- /dev/null
+/*
+
+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;
+ }
+}
+++ /dev/null
-/*
-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();
- }
- }
-}
--- /dev/null
+/*
+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();
+ }
+ }
+}