133 lines
3.6 KiB
Bash
Executable File
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
|
|
|
|
#------------------------------------------------------------------------------
|