openfoam/wmake/scripts/makeParser

133 lines
3.6 KiB
Bash
Executable File

#!/bin/sh
#------------------------------------------------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
# \\/ M anipulation |
#------------------------------------------------------------------------------
# License
# This file is part of OpenFOAM, licensed under GNU General Public License
# <http://www.gnu.org/licenses/>.
#
# Script
# makeParser
#
# Description
# Pregenerate ragel code and/or lemon parser headers
#
#------------------------------------------------------------------------------
usage() {
exec 1>&2
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
cat<<USAGE
Usage: ${0##*/} [options]
options:
-prefix=NAME Common prefix for parser and scanner
-parser=FILE Generate lemon parser header
-scanner=FILE Generate ragel scanner code
-parser Use 'LemonParser.lyy' for non-prefixed parser name
-parser-m4 Use 'LemonParser.lyy-m4' for non-prefixed parser name
-scanner Use 'Scanner.rl' for non-prefixed scanner name
-code Generate lemon parser code
-with-debug Retain intermediate files (eg, m4 output)
-remove Remove generated code
-h, -help Print the usage
Pregenerate ragel code and/or lemon parser headers
USAGE
exit 1
}
#------------------------------------------------------------------------------
# Parse arguments and options
#------------------------------------------------------------------------------
unset prefix parser scanner optCode optDebug optRemove
while [ "$#" -gt 0 ]
do
case "$1" in
(-h | -help*) usage ;;
(-prefix=*) prefix="${1#*=}" ;;
(-parser=*) parser="${1#*=}" ;;
(-scanner=*) scanner="${1#*=}" ;;
(-parser) parser=LemonParser.lyy ;;
(-parser-m4) parser=LemonParser.lyy-m4 ;;
(-scanner) scanner=Scanner.rl ;;
(-code) optCode=true ;;
(-with-debug) optDebug=true ;;
(-remove) optRemove=true ;;
(*) break ;;
esac
shift
done
#------------------------------------------------------------------------------
# Remove file, with feedback. $1 = file, $2 = message
removeFile() {
if test -f "$1" && rm -f "$1" 2>/dev/null
then
echo "Removed generated $2 file"
else
echo "No generated $2 file to remove"
fi
}
case "$scanner" in
(*.rl)
input="${prefix}${scanner}"
output="${prefix}${scanner%.*}.cc"
if [ "$optRemove" = true ]
then
removeFile "$output" "ragel scanner"
elif command -v ragel >/dev/null
then
echo "Generating ragel scanner"
ragel -G2 -o "$output" "$input"
else
echo "No ragel, leaving scanner intact"
fi
echo
;;
esac
case "$parser" in
(*.ly | *.lyy | *.ly*m4)
extCode=cc
input="${prefix}${parser}"
output="${parser%.*}.h"
# Pass -with-debug to wrap-lemon
[ -n "$optDebug" ] && optDebug="-with-debug"
# Additional message (eg, using m4 etc)
unset message
case "$parser" in (*m4) message=", using m4 filtering" ;; esac
if [ "$optRemove" = true ]
then
removeFile "$output" "lemon header"
elif [ "$optCode" = true ]
then
echo "Generating lemon parser code ($extCode)$message"
"$WM_PROJECT_DIR/wmake/scripts/wrap-lemon" $optDebug -e"$extCode" -s "$input"
else
echo "Generating lemon parser header$message"
"$WM_PROJECT_DIR/wmake/scripts/wrap-lemon" $optDebug -header -s "$input"
fi
echo
;;
esac
#------------------------------------------------------------------------------