Cherry pick use of menhir features from branch feature/menhir.
authorKim Nguyễn <kn@lri.fr>
Mon, 17 Mar 2014 13:08:57 +0000 (14:08 +0100)
committerKim Nguyễn <kn@lri.fr>
Mon, 17 Mar 2014 13:08:57 +0000 (14:08 +0100)
Work around a bug in menhir that generates code with the 'lexer' identifier which in turn makes ulex syntax extension choke.

Remakefile.in
src/xpath/xpath_internal_parser.mly

index 5c3fe42..2a32aa2 100644 (file)
@@ -26,9 +26,6 @@ MENHIR = @MENHIR@
 
 all: $(BIN)
 
-src/xpath/xpath_internal_parser.cmx: OCAMLFINDFLAGS = $(OCAMLFINDFLAGSNOSYNTAX)
-src/xpath/xpath_internal_parser.cmo: OCAMLFINDFLAGS = $(OCAMLFINDFLAGSNOSYNTAX)
-
 tools: tools/xml_diff.native$(EXE) tools/XPathEval.class tools/split_path.native$(EXE)
 
 Remakefile: Remakefile.in config.status
@@ -82,7 +79,11 @@ distclean: clean test_clean
 %.ml:
        if test -f $*.mly; then
                $(REMAKE) $*.mly
-               $(MENHIR) $*.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
        elif test -f $*.mll; then
                $(REMAKE) $*.mll
                $(OCAMLLEX) $*.mll
@@ -114,7 +115,7 @@ distclean: clean test_clean
        OCAMLDEP="$(OCAMLDEP) $(OCAMLFINDFLAGS)"
        OCAMLNATIVE=$(OCAMLNATIVE)
        SRC=$(SRC)
-       COMPILE="$(OCAMLC) $(OCAMLFLAGS) $(OCAMLCFLAGS) $(OCAMLFIND_EXTRAFLAGS) "
+       COMPILE="$(OCAMLC) $(OCAMLFLAGS) $(OCAMLCFLAGS) $(OCAMLFINDFLAGS)"
        . tools/ocamldriver.sh
 
 %.cmi:
index e5c0700..f0207ea 100644 (file)
@@ -50,15 +50,9 @@ path EOF          { $1 }
 ;
 
 path:
-  path_rev { List.rev $1 }
+  separated_nonempty_list(PIPE, simple_path)  { $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) }
@@ -76,6 +70,7 @@ 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 }
@@ -159,24 +154,27 @@ expr:
 | FLOAT                     { Number(`Float($1)) }
 | STRING                    { String $1 }
 | SUB expr     %prec uminus { Unop(Neg, $2) }
-| 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) }
+| e1 = expr; op = binop; e2 = expr             { Binop(e1, op, e2) }
 | 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 }