From: Kim Nguyễn Date: Mon, 17 Mar 2014 13:08:57 +0000 (+0100) Subject: Cherry pick use of menhir features from branch feature/menhir. X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=commitdiff_plain;h=456aa2cae4ba3afc4fe364880e52f66490700650 Cherry pick use of menhir features from branch feature/menhir. Work around a bug in menhir that generates code with the 'lexer' identifier which in turn makes ulex syntax extension choke. --- diff --git a/Remakefile.in b/Remakefile.in index 5c3fe42..2a32aa2 100644 --- a/Remakefile.in +++ b/Remakefile.in @@ -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: diff --git a/src/xpath/xpath_internal_parser.mly b/src/xpath/xpath_internal_parser.mly index e5c0700..f0207ea 100644 --- a/src/xpath/xpath_internal_parser.mly +++ b/src/xpath/xpath_internal_parser.mly @@ -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 }