However, on large inputs especially (like the stp/testcase benchmarks), this inlining feature can speed parsing by 5-10%, at the cost of not supporting interactive sessions on stdin (like in the SMT-COMP application track).
So I updated the submission script and competition build so that
* a competition build with antlr-inlining is built for the main and parallel tracks
* a competition build without antlr-inlining is built for the application track
Again, the effect is only when reading the stdin stream (but that's how SMT-COMP works). For normal (non-competition) builds, we need to support interactive sessions (from e.g. KIND) on stdin, so this inlining is off for all builds except main- and parallel-track competition builds.
Also added a "get-antlr-3.4" script that automatically downloads and locally installs a copy of libantlr3c and the antlr parser generator inside the CVC4 source tree.
Closing bug #319.
YEAR := $(shell date +%Y)
submission:
+ @if [ -n "`ls src/parser/*/generated`" ]; then \
+ echo 'ERROR:' >&2; \
+ echo 'ERROR: Please make maintainer-clean first.' >&2; \
+ echo 'ERROR:' >&2; \
+ exit 1; \
+ fi
if [ ! -e configure ]; then ./autogen.sh; fi
./configure competition --disable-shared --enable-static-binary --with-cln --with-portfolio
$(MAKE)
echo 'exec ./pcvc4 -L smt2 --no-interactive' ) > cvc4-parallel-smtcomp-$(YEAR)/run
chmod 755 cvc4-parallel-smtcomp-$(YEAR)/run
tar cf cvc4-parallel-smtcomp-$(YEAR).tar cvc4-parallel-smtcomp-$(YEAR)
- # application track
+ # application track is a separate build
+ make maintainer-clean
+ if [ ! -e configure ]; then ./autogen.sh; fi
+ ./configure competition --disable-shared --enable-static-binary --with-cln CXXFLAGS=-DCVC4_SMTCOMP_APPLICATION_TRACK CFLAGS=-DCVC4_SMTCOMP_APPLICATION_TRACK
+ $(MAKE)
+ strip builds/bin/cvc4
+ $(MAKE) regress1
+ # package the application track tarball
mkdir -p cvc4-application-smtcomp-$(YEAR)
cp -p builds/bin/cvc4 cvc4-application-smtcomp-$(YEAR)/cvc4
( echo '#!/bin/sh'; \
[No usable antlr3 script found. Make sure that the parser code has
been generated already. To obtain ANTLR see <http://www.antlr.org/>.]
)
+ ANTLR_VERSION=
+ else
+ ANTLR_VERSION="`$ANTLR -version 2>&1 | sed 's,.*\<Version *\([[0-9.]]*\).*,\1,'`"
+ case "$ANTLR_VERSION" in
+ 3.2|3.2.*) ANTLR_VERSION=3.2 ;;
+ 3.4|3.4.*) ANTLR_VERSION=3.4 ;;
+ *) AC_MSG_WARN([unknown version of antlr: $ANTLR_VERSION]);;
+ esac
fi
])
])],
[
AC_MSG_RESULT([found it (must be antlr3 3.2 or similar)])
+ if test -n "$ANTLR_VERSION" -a "$ANTLR_VERSION" != 3.2; then
+ AC_MSG_WARN([your antlr parser generator is version $ANTLR_VERSION, which doesn't match the library!])
+ fi
CVC4CPPFLAGS="${CVC4CPPFLAGS:+$CVC4CPPFLAGS }-DCVC4_ANTLR3_OLD_INPUT_STREAM"
],
[
])],
[
AC_MSG_RESULT([found it (must be antlr3 3.4 or similar)])
+ if test -n "$ANTLR_VERSION" -a "$ANTLR_VERSION" != 3.4; then
+ AC_MSG_WARN([your antlr parser generator is version $ANTLR_VERSION, which doesn't match the library!])
+ fi
],
[
AC_MSG_ERROR([cannot figure out how to create an antlr3 input stream, bailing..])
new-theory \
configure-in-place \
depgraph \
+ get-antlr-3.4 \
theoryskel/kinds \
theoryskel/Makefile \
theoryskel/Makefile.am \
--- /dev/null
+#!/bin/bash
+#
+set -e
+
+cd "$(dirname "$0")/.."
+
+if ! [ -e src/parser/cvc/Cvc.g ]; then
+ echo "$(basename $0): I expect to be in the contrib/ of a CVC4 source tree," >&2
+ echo "but apparently:" >&2
+ echo >&2
+ echo " $(pwd)" >&2
+ echo >&2
+ echo "is not a CVC4 source tree ?!" >&2
+ exit 1
+fi
+
+set -x
+mkdir -p antlr-3.4/share/java
+mkdir -p antlr-3.4/bin
+mkdir -p antlr-3.4/src
+cd antlr-3.4
+wget -c -O share/java/antlr-3.4-complete.jar http://antlr.org/download/antlr-3.4-complete.jar
+wget -c -O src/libantlr3c-3.4.tar.gz http://antlr.org/download/C/libantlr3c-3.4.tar.gz
+tee bin/antlr3 <<EOF
+#!/bin/sh
+export CLASSPATH=/usr/share/java/stringtemplate.jar:`pwd`/share/java/antlr-3.4-complete.jar:\$CLASSPATH
+exec java org.antlr.Tool "\$@"
+EOF
+chmod a+x bin/antlr3
+cd src
+tar xfzv libantlr3c-3.4.tar.gz
+cd libantlr3c-3.4
+./configure --enable-64bit --prefix=`pwd`/../..
+cp Makefile Makefile.orig
+sed 's,^CFLAGS = .*,\0 -fexceptions,' Makefile.orig > Makefile
+make
+make install
+set +x
+cd ../../..
+
+echo
+echo Invalidating generated parsers..
+touch src/parser/*/*.g
+
+echo
+echo ===================== Now configure CVC4 with =====================
+echo ./configure --with-antlr-dir=`pwd`/antlr-3.4 ANTLR=`pwd`/antlr-3.4/bin/antlr3
// If in competition mode, set output stream option to flush immediately
#ifdef CVC4_COMPETITION_MODE
*options.out << unitbuf;
-#endif
+#endif /* CVC4_COMPETITION_MODE */
// We only accept one input file
if(argc > firstArgIndex + 1) {
ParserBuilder parserBuilder(&exprMgr, filename, options);
if( inputFromStdin ) {
+#if defined(CVC4_COMPETITION_MODE) && !defined(CVC4_SMTCOMP_APPLICATION_TRACK)
+ parserBuilder.withStreamInput(cin);
+#else /* CVC4_COMPETITION_MODE && !CVC4_SMTCOMP_APPLICATION_TRACK */
parserBuilder.withLineBufferedStreamInput(cin);
+#endif /* CVC4_COMPETITION_MODE && !CVC4_SMTCOMP_APPLICATION_TRACK */
}
Parser *parser = parserBuilder.build();
// exit, don't return
// (don't want destructors to run)
exit(returnValue);
-#endif
+#endif /* CVC4_COMPETITION_MODE */
ReferenceStat< Result > s_statSatResult("sat/unsat", result);
RegisterStatistic statSatResultReg(exprMgr, &s_statSatResult);
// If in competition mode, set output stream option to flush immediately
#ifdef CVC4_COMPETITION_MODE
*options.out << unitbuf;
-#endif
+#endif /* CVC4_COMPETITION_MODE */
// We only accept one input file
if(argc > firstArgIndex + 1) {
withOptions(options);
if( inputFromStdin ) {
+#if defined(CVC4_COMPETITION_MODE) && !defined(CVC4_SMTCOMP_APPLICATION_TRACK)
+ parserBuilder.withStreamInput(cin);
+#else /* CVC4_COMPETITION_MODE && !CVC4_SMTCOMP_APPLICATION_TRACK */
parserBuilder.withLineBufferedStreamInput(cin);
+#endif /* CVC4_COMPETITION_MODE && !CVC4_SMTCOMP_APPLICATION_TRACK */
}
Parser *parser = parserBuilder.build();
// exit, don't return
// (don't want destructors to run)
exit(returnValue);
-#endif
+#endif /* CVC4_COMPETITION_MODE */
// ReferenceStat< Result > s_statSatResult("sat/unsat", result);
// RegisterStatistic statSatResultReg(*exprMgr, &s_statSatResult);
* the lexer headers for two grammars AND (b) uses the token symbol definitions. */
#pragma GCC system_header
+#if defined(CVC4_COMPETITION_MODE) && !defined(CVC4_SMTCOMP_APPLICATION_TRACK)
/* This improves performance by ~10 percent on big inputs.
* This option is only valid if we know the input is ASCII (or some 8-bit encoding).
* If we know the input is UTF-16, we can use ANTLR3_INLINE_INPUT_UTF16.
* Otherwise, we have to let the lexer detect the encoding at runtime.
*/
-#define ANTLR3_INLINE_INPUT_ASCII
+# define ANTLR3_INLINE_INPUT_ASCII
+# define ANTLR3_INLINE_INPUT_8BIT
+#endif /* CVC4_COMPETITION_MODE && !CVC4_SMTCOMP_APPLICATION_TRACK */
#include "parser/antlr_tracing.h"
#include "util/integer.h"
*/
#pragma GCC system_header
+#if defined(CVC4_COMPETITION_MODE) && !defined(CVC4_SMTCOMP_APPLICATION_TRACK)
/* This improves performance by ~10 percent on big inputs.
* This option is only valid if we know the input is ASCII (or some 8-bit encoding).
* If we know the input is UTF-16, we can use ANTLR3_INLINE_INPUT_UTF16.
* Otherwise, we have to let the lexer detect the encoding at runtime.
*/
-#define ANTLR3_INLINE_INPUT_ASCII
+# define ANTLR3_INLINE_INPUT_ASCII
+# define ANTLR3_INLINE_INPUT_8BIT
+#endif /* CVC4_COMPETITION_MODE && !CVC4_SMTCOMP_APPLICATION_TRACK */
#include "parser/antlr_tracing.h"
}/* @lexer::includes */
*/
#pragma GCC system_header
+#if defined(CVC4_COMPETITION_MODE) && !defined(CVC4_SMTCOMP_APPLICATION_TRACK)
/* This improves performance by ~10 percent on big inputs.
* This option is only valid if we know the input is ASCII (or some 8-bit encoding).
* If we know the input is UTF-16, we can use ANTLR3_INLINE_INPUT_UTF16.
* Otherwise, we have to let the lexer detect the encoding at runtime.
*/
-#define ANTLR3_INLINE_INPUT_ASCII
+# define ANTLR3_INLINE_INPUT_ASCII
+# define ANTLR3_INLINE_INPUT_8BIT
+#endif /* CVC4_COMPETITION_MODE && !CVC4_SMTCOMP_APPLICATION_TRACK */
#include "parser/antlr_tracing.h"