#!/bin/bash
## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##     http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.

# Parser builder

GRAMMAR="${GRAMMAR:-"sse.jj"}"
ROOT="../.."
# --------------------------------------------------------

function grammar
{
    FILE="$1"
    PKG="$2"
    CLASS="$3"

    echo $1 $2 $3

    DIR="$ROOT/src/main/java/org/apache/jena/sparql/$PKG"
    (cd "$DIR" ; rm -f TokenMgrError.java ParseException.java Token.java JavaCharStream.java )

    echo "---- Process grammar -- $1"
    javacc -OUTPUT_DIRECTORY=$DIR -JDK_VERSION=1.5 "${FILE}"
    RC=$?

    [ "$RC" = 0 ] || return $RC

##     echo "---- Create HTML"
##     jjdoc -OUTPUT_FILE=${FILE%%.jj}.html "${FILE}"
    echo "---- Create text form"
    jjdoc -TEXT=true -OUTPUT_FILE=${FILE%%.jj}.txt "${FILE}"

    # Fix unnecessary imports
    echo "---- Fixing Java warnings in ${CLASS}TokenManager ..."
    F="$DIR/${CLASS}TokenManager.java"
    sed -e 's/@SuppressWarnings."unused".//' \
        -e 's/import .*//' -e 's/MatchLoop: do/do/' \
        -e 's/int hiByte = (int)(curChar/int hiByte = (curChar/' \
	< $F > F
    mv F $F

##     # Java5+ fixups
##     echo "---- Fixing Java warnings in JavaCharStream ..."
##     # Deprecated:
##     #   public int getColumn()
##     #   public int getLine()
##     F="$DIR/JavaCharStream.java"
##     if [ -e "$F" ]
## 	then
## 	sed -e 's/@Deprecated //' \
## 	    -e 's/public int getColumn/@Deprecated public int getColumn/' \
## 	    -e 's/public int getLine/@Deprecated public int getLine/' < $F > F
## 	mv F $F
##     fi
## 
    echo "---- Fixing Java warnings in ParseException ..."
    #Override:
    #   public String getMessage()
    F="$DIR/ParseException.java"
    sed -e 's/@Override //' \
	-e 's/public String getMessage/@Override public String getMessage/' < $F > F
    mv F $F

    echo "---- Fixing Java warnings in Token ..."
    F="$DIR/Token.java"
    sed -e 's/@Override //' \
	-e 's/public String toString/@Override public String toString/' < $F > F
    mv F $F

    echo "---- Fixing Java warnings in TokenMgrError ..."
    # Override:
    #   public String getMessage()
    F="$DIR/TokenMgrError.java"
    sed -e 's/@Override //' \
	-e 's/public String getMessage/@Override public String getMessage/' < $F > F
    mv F $F

     echo "---- Fixing Java warnings in ${CLASS} ..."
    F="$DIR/${CLASS}.java"
    sed -e 's/public class /\n@SuppressWarnings("all")\npublic class /' < $F > F
    mv F $F

    echo "---- Done"
}

if [ $# == 0 ]
then
    set -- unisyn
    ## echo "Usage: grammar [arq|sparql|rdql]" 1>&2
    ## exit 1
    fi

for G in "$@"
do
    case "$G" in
	unisyn)
	    cp ../header.jj parser.jj
	    # The parser that is exactly the working group grammar
	    cat "$GRAMMAR" | cpp -P >> parser.jj
	    grammar parser.jj sse/lang/parser SSE_ParserCore
	    [ "$RC" = 0 ] && rm parser.jj
	    ;;
	*)    echo "**** Unknown grammar: $G" 1>&2
	      ;;
    esac
done
