#!/bin/bash

# ----------------------------------------------------------------
# Setup
us=$(basename $0)
set -euo pipefail

verbose="false"

if [ $# -eq 1 ]; then
  bnf="$1"
elif [ $# -eq 2 ]; then
  if [ "$1" = "-v" ]; then
    verbose="true"
  else
    echo "Usage: $0 {.bnf file}" 1>&2
    exit 1
  fi
  bnf="$2"
else
  echo "Usage: $0 {.bnf file}" 1>&2
  exit 1
fi

dir=src/experimental
mkdir -p $dir

# ----------------------------------------------------------------
# Run the parser-generator

# Build the bin/gocc executable:
#go get github.com/goccmack/gocc
go get github.com/johnkerl/gocc
bingocc="$GOPATH/bin/gocc"
if [ ! -x "$bingocc" ]; then
  exit 1
fi

rm -f $dir/*.txt
if [ "$verbose" = "true" ]; then
  lr1="$dir/LR1_conflicts.txt"
  # The -o specifies the package name within the autogen
  $bingocc -v -o $dir $bnf || expand -2 $lr1
else
  $bingocc -o $dir $bnf
fi

echo "Parser-autogen OK"

# Code-gen directories:
#   $dir/errors/
#   $dir/lexer/
#   $dir/parser/
#   $dir/token/
#   $dir/util/

# ----------------------------------------------------------------
# Override GOCC codegen with customized error handling
cp ../../src/parsing/errors.go.template src/experimental/errors/errors.go
sed -i .bak 's:miller/parsing:experimental:' src/experimental/errors/errors.go

# ----------------------------------------------------------------
# Copy AST files from the main Miller tree

rm -rf ./src/lib/
rm -rf ./src/dsl/

mkdir -p ./src/lib/
mkdir -p ./src/dsl/

cp ../../src/lib/*.go ./src/lib/
cp ../../src/dsl/ast*.go ./src/dsl/

# Different path to autogen between main Miller tree and here
sed -i .bak 's:miller/parsing:experimental:' src/dsl/ast*go

# ----------------------------------------------------------------
# Compile the main and the parser-autogen

go build main.go
echo "Compile OK"
