| #!/bin/bash |
| # |
| # This script runs antlr3 generating java code based on .g (ANLTR3) files. |
| # antlr3 tool itself can be downloaded by running the gradle build. |
| # |
| # The script can be run from anywhere (it does not depend on current working directory) |
| # Set $ANTLR to overwrite antlr location, if desired |
| # |
| # After making any changes to the lexer, the update source file(s) generated by |
| # this script should be checked in to the repository |
| |
| # Update when switching to a different version of antlr |
| EXPECTED_ANTLR_VERSION_STR="ANTLR Parser Generator Version 3.5" |
| |
| # Get the location of this script used to find locations of other things in the tree. |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| |
| # Point to the directory which contains the ANTLR jars. |
| if [[ -z "$ANTLR" ]] |
| then |
| # Best effort to find it inside of the gradle cache |
| ANTLR="$(find $HOME/.gradle/caches/artifacts-* -name 'org.antlr' | head -n 1)" |
| fi |
| |
| # Class that contains the static main function. |
| ANTLR_MAIN="org.antlr.Tool" |
| |
| if ! [[ -d "$ANTLR" ]]; then |
| echo >&2 "ERROR: Could not find ANTLR jars directory" |
| exit 1 |
| fi |
| |
| # Build up the classpath by finding all the JARs |
| ANTLR_JARS="" |
| |
| for jar_file_name in $(find "$ANTLR" -name '*.jar'); do |
| if ! [[ -z "$ANTLR_JARS" ]]; then |
| ANTLR_JARS+=":" |
| fi |
| ANTLR_JARS+="$jar_file_name" |
| done |
| |
| if [[ -z "$ANTLR_JARS" ]]; then |
| echo >&2 "Could not find any JARs in the ANTLR directory" |
| echo >&2 "Is '"$ANTLR"' the correct path to the JARs?" |
| exit 1 |
| fi |
| |
| function run_antlr() { |
| CLASSPATH="$ANTLR_JARS" java 2>&1 "$ANTLR_MAIN" "$@" |
| } |
| |
| ANTLR_VERSION="$(run_antlr -version)" |
| |
| if [[ -z "$ANTLR_VERSION" ]] |
| then |
| echo >&2 "ERROR: Failed to execute antlr at \"$ANTLR\"" |
| exit 1 |
| fi |
| |
| if [[ "$EXPECTED_ANTLR_VERSION_STR" != "$ANTLR_VERSION" ]] |
| then |
| echo >&2 "ERROR: Wrong version of jflex: \"$ANTLR_VERSION\". Expected: \"$EXPECTED_ANTLR_VERSION_STR\"" |
| exit 1 |
| fi |
| |
| |
| function generate_file { |
| local JAVA_FILE="$1" |
| local G_FILE="$2" |
| |
| if ! [[ -f "$JAVA_FILE" ]]; then |
| echo >&2 "ERROR: File \"$JAVA_FILE\" not found" |
| exit 1 |
| fi |
| |
| echo "Re-generating \"$JAVA_FILE\"..." |
| |
| [[ -f "$JAVA_FILE" ]] && rm -f "$JAVA_FILE" |
| |
| local JAVA_DIR="$(dirname "$JAVA_FILE")" |
| # Generate the java file from the antlr file |
| run_antlr -verbose -fo "$JAVA_DIR" "$G_FILE" |
| |
| # delete trailing space from end of each line to make gerrit happy |
| sed 's/[ ]*$//' "$JAVA_FILE" > "$JAVA_FILE.tmp" |
| [[ -f "$JAVA_FILE" ]] && rm "$JAVA_FILE" |
| mv "$JAVA_FILE.tmp" "$JAVA_FILE" |
| |
| echo "DONE" |
| echo "" |
| echo "" |
| } |
| |
| function cleanup_tokens { |
| local JAVA_FILE="$1" |
| |
| # delete the tokens file, they are not necessary to actually build from Android.mk |
| local TOKEN_FILE="${JAVA_FILE%%\.java}.tokens" |
| [[ -f "$TOKEN_FILE" ]] && rm "$TOKEN_FILE" |
| } |
| |
| generate_file "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliParser.java" "$SCRIPT_DIR/src/main/antlr3/smaliParser.g" |
| generate_file "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliTreeWalker.java" "$SCRIPT_DIR/src/main/antlr3/smaliTreeWalker.g" |
| |
| # Clean up the tokens, no longer necessary once the tree walker is generated |
| cleanup_tokens "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliParser.java" |
| cleanup_tokens "$SCRIPT_DIR/src/main/java/org/jf/smali/smaliTreeWalker.java" |
| |
| # Uncomment to run interactively |
| #run_antlr "$@" |