From 31d45495fda9a110fd348f8b492761c28b434ec9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kim=20Nguy=E1=BB=85n?= Date: Tue, 29 Apr 2014 09:45:26 +0200 Subject: [PATCH] Revert the integration of menhir for the time being. Revert "Cherry pick use of menhir features from branch feature/menhir." Revert "Further simplify Remakefile. Remove some inefficiency in module dependency checking script." Revert "Remove passing $NATIVE on the remake command line of every target, since variable contents are propagated." Revert "Modify configure.in and Remakefile.in to use menhir instead of ocamlyacc." --- Remakefile.in | 70 ++++++++---------- configure.in | 111 +++++++++++----------------- src/xpath/xpath_internal_parser.mly | 38 +++++----- tools/ocamldriver.sh | 8 +- tools/ocamlmoduledep.sh | 16 ++-- 5 files changed, 105 insertions(+), 138 deletions(-) diff --git a/Remakefile.in b/Remakefile.in index 2a32aa2..1ff0b30 100644 --- a/Remakefile.in +++ b/Remakefile.in @@ -1,11 +1,10 @@ .OPTIONS = variable-propagation - OCAMLFINDPACKAGES = "ulex,unix,expat,camlp4.macro,bigarray" OCAMLFINDSYNTAX = camlp4o OCAMLFINDPPOPTS = $(addprefix "-ppopt ", @CAMLP4FLAGS@ -I include) OCAMLFINDINCLUDES = $(addprefix "-I ", src) -OCAMLFINDFLAGSNOSYNTAX = -package $(OCAMLFINDPACKAGES) $(OCAMLFINDPPOPTS) $(OCAMLFINDINCLUDES) -OCAMLFINDFLAGS = -syntax $(OCAMLFINDSYNTAX) $(OCAMLFINDFLAGSNOSYNTAX) +OCAMLFINDFLAGS = -syntax $(OCAMLFINDSYNTAX) -package $(OCAMLFINDPACKAGES) \ + $(OCAMLFINDPPOPTS) $(OCAMLFINDINCLUDES) OCAMLFINDLINKFLAGS = -linkpkg PACKAGE = @PACKAGE_TARNAME@ SRC = src @@ -14,15 +13,14 @@ BYTE = src/@PACKAGE_TARNAME@.byte@EXE@ EXE = @EXE@ REMAKE = @REMAKE@ +OCAMLDEP = @OCAMLDEP@ +ODEPS = tools/odeps.sh $(OCAMLDEP) OCAMLC = @OCAMLC@ OCAMLOPT = @OCAMLOPT@ -OCAMLDEP = @OCAMLDEP@ -OCAMLFLAGS = @OCAMLFLAGS@ +OCAMLFLAGS = @OCAMLFLAGS@ OCAMLOPTFLAGS = @OCAMLOPTFLAGS@ OCAMLCFLAGS = @OCAMLCFLAGS@ -MENHIR = @MENHIR@ - -.PHONY:clean real_test test_native test +OCAMLYACC = @OCAMLYACC@ all: $(BIN) @@ -63,27 +61,23 @@ distclean: clean test_clean %.class: %.java javac $< -%.native$(EXE): - $(REMAKE) OCAMLNATIVE="-native" $*.cmx $*.depx +%.native$(EXE): %.cmx %.depx + if test -f $@".flags"; then + FLAGS=`cat $@".flags"` + fi objects=`cat $*.depx | xargs | sed 's/[.]depx/.cmx/g'` $(REMAKE) OCAMLNATIVE="-native" $objects #ensure all objects have been built - $(OCAMLOPT) -o $@ $(OCAMLFLAGS) $(OCAMLOPTFLAGS) $(OCAMLFINDLINKFLAGS) $(OCAMLFINDFLAGS) $objects $*.cmx - + $(OCAMLOPT) -o $@ $(OCAMLFLAGS) $(OCAMLOPTFLAGS) $(OCAMLFINDLINKFLAGS) $(OCAMLFINDFLAGS) $FLAGS $objects $< -%.byte$(EXE): - $(REMAKE) OCAMLNATIVE="" $*.cmo $*.depo +%.byte$(EXE): %.cmo %.depo objects=`cat $*.depo | xargs | sed 's/[.]depo/.cmo/g'` $(REMAKE) OCAMLNATIVE="" $objects #ensure all objects have been built - $(OCAMLC) -o $@ $(OCAMLFLAGS) $(OCAMLCFLAGS) $(OCAMLFINDLINKFLAGS) $(OCAMLFINDFLAGS) $objects $*.cmo + $(OCAMLC) -o $@ $(OCAMLFLAGS) $(OCAMLCFLAGS) $(OCAMLFINDLINKFLAGS) $(OCAMLFINDFLAGS) $objects $< %.ml: if test -f $*.mly; then $(REMAKE) $*.mly - #Work around menhir warning - $(MENHIR) $*.mly 2>&1 | grep -v -- 'you are\|--infer' - #Work around crazy ulex chocking on identifier 'lexer', generated by menhir. - cat $*.ml | sed -e 's/\blexer\b/__lexer/g' > $*.tmp - mv $*.tmp $*.ml + $(OCAMLYACC) $*.mly elif test -f $*.mll; then $(REMAKE) $*.mll $(OCAMLLEX) $*.mll @@ -99,21 +93,23 @@ distclean: clean test_clean base=$* target=$@ DEPEXT=depx - REMAKE="$(REMAKE)" + NATIVE=-native + REMAKE="$(REMAKE) OCAMLNATIVE=$NATIVE" OCAMLDEP="$(OCAMLDEP) $(OCAMLFINDFLAGS)" - OCAMLNATIVE=$(OCAMLNATIVE) SRC=$(SRC) - COMPILE="$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) $(OCAMLFINDFLAGS)" + if test -f "$base".flags; then + FLAGS=`cat "$base".flags` + fi + COMPILE="$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) $(OCAMLFINDFLAGS) $FLAGS" . tools/ocamldriver.sh - %.cmo %.depo: base=$* target=$@ DEPEXT=depo - REMAKE="$(REMAKE)" + NATIVE="" + REMAKE="$(REMAKE) OCAMLNATIVE=$NATIVE" OCAMLDEP="$(OCAMLDEP) $(OCAMLFINDFLAGS)" - OCAMLNATIVE=$(OCAMLNATIVE) SRC=$(SRC) COMPILE="$(OCAMLC) $(OCAMLFLAGS) $(OCAMLCFLAGS) $(OCAMLFINDFLAGS)" . tools/ocamldriver.sh @@ -121,11 +117,11 @@ distclean: clean test_clean %.cmi: base=$* target=$@ - REMAKE="$(REMAKE)" + NATIVE=$(OCAMLNATIVE) + REMAKE="$(REMAKE) OCAMLNATIVE=$NATIVE" OCAMLDEP="$(OCAMLDEP) $(OCAMLFINDFLAGS)" SRC=$(SRC) - OCAMLNATIVE=$(OCAMLNATIVE) - if test -z "$OCAMLNATIVE"; then + if test -z "$NATIVE"; then DEPEXT=.depo COMPILE="$(OCAMLC) $(OCAMLFLAGS) $(OCAMLCFLAGS) $(OCAMLFINDFLAGS)" else @@ -136,9 +132,15 @@ distclean: clean test_clean ## Tests +test_byte: tools $(BYTE) + $(REMAKE) TEST=$(BYTE) real_test + +test_native: tools $(BIN) + $(REMAKE) TEST=$(BIN) real_test + +test: test_native real_test: - echo $(TEST) for i in tests/*.xml do for j in 1 2 3 @@ -147,18 +149,10 @@ real_test: done done -test_byte: - $(REMAKE) TEST=$(BYTE) real_test -test_native: - $(REMAKE) TEST=$(BIN) real_test - -test: test_native - test_clean: rm -rf tests/*.summary tests/*.results/*_"$(PACKAGE)"_*.* %.summary: - $(REMAKE) tools $(TEST) target=$@ base=$* test=${base#*.xml.} diff --git a/configure.in b/configure.in index 34a9e31..5bcb4c0 100644 --- a/configure.in +++ b/configure.in @@ -68,50 +68,49 @@ esac AC_SUBST(OCAMLVERSION) -dnl ocamlyacc and ocamllex are not needed #detect ocamlyacc -dnl OCAMLYACC=ocamlyacc -dnl AC_ARG_WITH([ocamlyacc], -dnl AS_HELP_STRING([--with-ocamlyacc=PATH], [location of the ocamlyacc binary]), -dnl [OCAMLYACC="$withval"]) -dnl AC_MSG_CHECKING([for ocamlyacc ($OCAMLYACC)]) -dnl OCAMLYACC_VERSION=$($OCAMLYACC -version 2>/dev/null || echo foo) -dnl case "$OCAMLYACC_VERSION" in -dnl *$OCAMLVERSION) -dnl AC_MSG_RESULT([ok]) -dnl ;; -dnl foo) -dnl AC_MSG_RESULT([failed]) -dnl AC_MSG_ERROR([Cannot find ocamlyacc]) -dnl ;; -dnl *) -dnl AC_MSG_RESULT([failed]) -dnl AC_MSG_ERROR([Bad ocamlyacc version]) -dnl ;; -dnl esac -dnl AC_SUBST([OCAMLYACC]) - -dnl #detect ocamllex -dnl OCAMLLEX=ocamllex -dnl AC_ARG_WITH([ocamllex], -dnl AS_HELP_STRING([--with-ocamllex=PATH], [location of the ocamllex binary]), -dnl [OCAMLLEX="$withval"]) -dnl AC_MSG_CHECKING([for ocamllex ($OCAMLLEX)]) -dnl OCAMLLEX_VERSION=$($OCAMLLEX -version 2>/dev/null || echo foo) -dnl case "$OCAMLLEX_VERSION" in -dnl *$OCAMLVERSION) -dnl AC_MSG_RESULT([ok]) -dnl ;; -dnl foo) -dnl AC_MSG_RESULT([failed]) -dnl AC_MSG_ERROR([Cannot find ocamllex]) -dnl ;; -dnl *) -dnl AC_MSG_RESULT([failed]) -dnl AC_MSG_ERROR([Bad ocamllex version]) -dnl ;; -dnl esac -dnl AC_SUBST([OCAMLLEX]) +OCAMLYACC=ocamlyacc +AC_ARG_WITH([ocamlyacc], + AS_HELP_STRING([--with-ocamlyacc=PATH], [location of the ocamlyacc binary]), + [OCAMLYACC="$withval"]) +AC_MSG_CHECKING([for ocamlyacc ($OCAMLYACC)]) +OCAMLYACC_VERSION=$($OCAMLYACC -version 2>/dev/null || echo foo) +case "$OCAMLYACC_VERSION" in + *$OCAMLVERSION) + AC_MSG_RESULT([ok]) + ;; + foo) + AC_MSG_RESULT([failed]) + AC_MSG_ERROR([Cannot find ocamlyacc]) + ;; + *) + AC_MSG_RESULT([failed]) + AC_MSG_ERROR([Bad ocamlyacc version]) + ;; +esac +AC_SUBST([OCAMLYACC]) + +#detect ocamllex +OCAMLLEX=ocamllex +AC_ARG_WITH([ocamllex], + AS_HELP_STRING([--with-ocamllex=PATH], [location of the ocamllex binary]), + [OCAMLLEX="$withval"]) +AC_MSG_CHECKING([for ocamllex ($OCAMLLEX)]) +OCAMLLEX_VERSION=$($OCAMLLEX -version 2>/dev/null || echo foo) +case "$OCAMLLEX_VERSION" in + *$OCAMLVERSION) + AC_MSG_RESULT([ok]) + ;; + foo) + AC_MSG_RESULT([failed]) + AC_MSG_ERROR([Cannot find ocamllex]) + ;; + *) + AC_MSG_RESULT([failed]) + AC_MSG_ERROR([Bad ocamllex version]) + ;; +esac +AC_SUBST([OCAMLLEX]) #detect camlp4 @@ -158,32 +157,6 @@ else AC_MSG_ERROR([Cannot find ulex.]) fi - -MENHIR=menhir -AC_ARG_WITH([menhir], - AS_HELP_STRING([--with-menhir=PATH], [location of the menhir binary]), - [MENHIR="$withval"]) - -AC_MSG_CHECKING([for menhir ($MENHIR)]) - -MENHIR_VERSION=$($MENHIR --version 2>/dev/null || echo not_found) -MENHIR_VERSION=$(echo "$MENHIR_VERSION" | cut -f 2- -d ',' | cut -f 2- -d ' ') -case "$MENHIR_VERSION" in - 'version 201'[[0-9]]*) - AC_MSG_RESULT([ok (${MENHIR_VERSION})]) - ;; - not_found) - AC_MSG_RESULT([failed]) - AC_MSG_ERROR([Cannot find menhir]) - ;; - *) - AC_MSG_RESULT([failed]) - AC_MSG_ERROR([Your version of menhir is too old (${MENHIR_VERSION})]) - ;; -esac -AC_SUBST([MENHIR]) - - AC_MSG_CHECKING([for expat]) expat_path=`$OCAMLFIND query expat 2>/dev/null` if test "$expat_path" ; then diff --git a/src/xpath/xpath_internal_parser.mly b/src/xpath/xpath_internal_parser.mly index f0207ea..e5c0700 100644 --- a/src/xpath/xpath_internal_parser.mly +++ b/src/xpath/xpath_internal_parser.mly @@ -50,9 +50,15 @@ path EOF { $1 } ; path: - separated_nonempty_list(PIPE, simple_path) { $1 } + path_rev { List.rev $1 } ; +path_rev: + simple_path { [ $1 ] } +| path_rev PIPE simple_path { $3 :: $1 } +; + + simple_path: absolute_path { Absolute (List.rev $1) } | relative_path { Relative (List.rev $1) } @@ -70,7 +76,6 @@ absolute_path: step is always a small list, of size 1-3 so @ is cheap */ - relative_path: step { $1 } | relative_path SLASH step { $3 @ $1 } @@ -154,27 +159,24 @@ expr: | FLOAT { Number(`Float($1)) } | STRING { String $1 } | SUB expr %prec uminus { Unop(Neg, $2) } -| e1 = expr; op = binop; e2 = expr { Binop(e1, op, e2) } +| expr AND expr { Binop($1, And, $3) } +| expr OR expr { Binop($1, Or, $3) } +| expr ADD expr { Binop($1, Add, $3) } +| expr SUB expr { Binop($1, Sub, $3) } +| expr STAR expr { Binop($1, Mult, $3) } +| expr DIV expr { Binop($1, Div, $3) } +| expr MOD expr { Binop($1, Mod, $3) } +| expr EQ expr { Binop($1, Eq, $3) } +| expr NEQ expr { Binop($1, Neq, $3) } +| expr LT expr { Binop($1, Lt, $3) } +| expr LTE expr { Binop($1, Lte, $3) } +| expr GT expr { Binop($1, Gt, $3) } +| expr GTE expr { Binop($1, Gte, $3) } | TAG LP arg_list RP { Fun_call(QName.of_string $1, $3) } | LP expr RP { $2 } | path { Path $1 } ; -%inline binop: -| AND { And } -| OR { Or } -| ADD { Add } -| SUB { Sub } -| STAR { Mult } -| DIV { Div } -| MOD { Mod } -| EQ { Eq } -| NEQ { Neq } -| LT { Lt } -| LTE { Lte } -| GT { Gt } -| GTE { Gte } -; arg_list: { [] } | arg_list1 { List.rev $1 } diff --git a/tools/ocamldriver.sh b/tools/ocamldriver.sh index d2a968e..6d8e39b 100644 --- a/tools/ocamldriver.sh +++ b/tools/ocamldriver.sh @@ -14,7 +14,7 @@ elif test -f ${base}.pack -a -d ${base}; then fi if test "$PACKDIR"; then PACKNAME=`echo $PACKDIR | cut -b1 | tr a-z A-Z`${PACKDIR#?} - if test "$OCAMLNATIVE"; then + if test "$NATIVE"; then FORPACK="-for-pack $PACKNAME" fi fi @@ -25,7 +25,7 @@ if test "$EXT" = i; then fi modules=`$OCAMLDEP -modules ${base}.mli | cut -f 2- -d ':'` - objects=`tools/ocamlmoduledep.sh -inter $OCAMLNATIVE $PACKINCLUDE -I $SRC $modules` + objects=`tools/ocamlmoduledep.sh -inter $NATIVE $PACKINCLUDE -I $SRC $modules` $REMAKE $objects $COMPILE -o ${target} -c $PACKINCLUDE ${base}.mli exit 0 @@ -33,14 +33,14 @@ fi if test "$DOPACK"; then modules=`cat ${base}.pack` - objects=`echo $modules | xargs tools/ocamlmoduledep.sh $OCAMLNATIVE $PACKINCLUDE -I $SRC ` + objects=`echo $modules | xargs tools/ocamlmoduledep.sh $NATIVE $PACKINCLUDE -I $SRC ` else $REMAKE ${base}.ml modules=`$OCAMLDEP -modules ${base}.ml | cut -f 2- -d ':'` if test "$EXT" = "o"; then INTER=-inter fi - objects=`tools/ocamlmoduledep.sh $INTER $OCAMLNATIVE $PACKINCLUDE -I $SRC $modules` + objects=`tools/ocamlmoduledep.sh $INTER $NATIVE $PACKINCLUDE -I $SRC $modules` fi $REMAKE $objects diff --git a/tools/ocamlmoduledep.sh b/tools/ocamlmoduledep.sh index 2833671..8575312 100755 --- a/tools/ocamlmoduledep.sh +++ b/tools/ocamlmoduledep.sh @@ -11,11 +11,10 @@ INCLUDES="" MODULES="" NATIVE=0 INTER=0 -OCAMLWHERE=$(ocamlc -where) while true; do case $1 in -I) - dir=`echo "$2" | sed "s:^+:${OCAMLWHERE}/:"` + dir=`echo "$2" | sed "s:^+:$(ocamlc -where)/:"` INCLUDES="$INCLUDES $dir" shift @@ -44,23 +43,22 @@ else ext=cmo fi - for MODULE in $MODULES; do - module="$(echo ${MODULE} | sed -e 's:\(.*\):\l\1:')" + module="$(echo $MODULE | cut -b1 | tr A-Z a-z)$(echo $MODULE | cut -b2-)" echo "$INCLUDES" | while read include; do if test -z "$include"; then continue; fi - base="${include}/${module}" + base="$include/$module" if test \( "$INTER" = "1" \) -a \( -f "$base".mli \) ; then ## if we want to depend only on cmi of a module - /bin/echo -n "${base}"."cmi " + /bin/echo -n "$base"."cmi " elif test -f "$base".ml -o -f "$base".mly -o -f "$base".mll -o -f "$base".pack -o -f "$base".ml.str; then ## else we depend on the implementation - /bin/echo -n "${base}"."${ext} " + /bin/echo -n "$base"."$ext " break - elif test -f "${base}".mli; then + elif test -f "$base".mli; then ## and fall back on depending on the cmi if the cmx is not available ## (which prevents cross-module inlining in the case of cmx) - /bin/echo -n "${base}"."cmi " + /bin/echo -n "$base"."cmi " break fi done -- 2.17.1