--- /dev/null
+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')
--- /dev/null
+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}"
+ }
+ }
+}
+
# 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 $@
+#--------------------------------------------------------------------------------
+# 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)/$*"
+#================================================================================
+# 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)/$*"
-$(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))')
# `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) $@
#!/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 $@
--- /dev/null
+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"
+ }
+}
Arithmetic2_SyntaxAnnotate\
Arithmetic2_SyntaxAnnotate__Test\
ANTLRv4_SyntaxAnnotate\
+ Arithmetic_Swap\
"
# where make will put the programs
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"
--- /dev/null
+#!/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 "$@"
+++ /dev/null
-#!/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 $@
+++ /dev/null
-#--------------------------------------------------------------------------------
-# 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)/$*"
+++ /dev/null
-#================================================================================
-# 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)/$*"
+++ /dev/null
-#================================================================================
-# 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-%
- @:
-
+++ /dev/null
-/*
- 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;
- }
-}
+++ /dev/null
-/* 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();
- }
- }
-}
+++ /dev/null
-/* 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();
- }
-
-}
+++ /dev/null
-/*
-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();
- }
- }
-}
+++ /dev/null
-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 + ")";
- }
- }
-
-}
-
+++ /dev/null
-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);
- }
-}
+++ /dev/null
-/*
-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();
- }
- }
-}
+++ /dev/null
-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();
- }
-}
+++ /dev/null
-
-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);
- }
-
-}
-
+++ /dev/null
-/*
- 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();
- }
- }
-}
+++ /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;
-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();
- }
- }
-}
+++ /dev/null
-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();
- }
-}
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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);
- }
-}
+++ /dev/null
-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);
- }
-}
--- /dev/null
+/*
+ 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;
+ }
+}
--- /dev/null
+/*
+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();
+ }
+ }
+}
--- /dev/null
+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 + ")";
+ }
+ }
+
+}
+
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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();
+ }
+ }
+}
--- /dev/null
+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);
+ }
+}
--- /dev/null
+/*
+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();
+ }
+ }
+}
--- /dev/null
+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();
+ }
+}
--- /dev/null
+
+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);
+ }
+
+}
+
--- /dev/null
+/*
+ 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();
+ }
+ }
+}
--- /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;
+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();
+ }
+ }
+}
--- /dev/null
+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();
+ }
+}
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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);
+ }
+}
--- /dev/null
+/* 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();
+ }
+ }
+}
--- /dev/null
+/* 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();
+ }
+
+}
--- /dev/null
+
+
+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
+
+
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)
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.
source "$DEVELOPER_HOME"/executor/env_build
echo "${BASH_SOURCE[0]}" "complete"
+
+# LocalWords: gradle antlr jdk REPO
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
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
-->
--- /dev/null
+
+rootProject.name = 'GQL_to_Cypher'
+