remove the yacc parser

The large diff in boot/menhir/parser_menhir.ml comes from the fact
that the token list is now included in it, instead of being merely
a reference to the yacc parsers' Parser.token type.
master
Gabriel Scherer 2018-08-25 14:32:17 +02:00
parent ffbc03860b
commit e6ecea4008
13 changed files with 2077 additions and 4495 deletions

58
.depend
View File

@ -89,6 +89,9 @@ parsing/builtin_attributes.cmo : utils/warnings.cmi parsing/parsetree.cmi \
parsing/builtin_attributes.cmx : utils/warnings.cmx parsing/parsetree.cmi \
parsing/location.cmx parsing/asttypes.cmi parsing/builtin_attributes.cmi
parsing/builtin_attributes.cmi : parsing/parsetree.cmi parsing/location.cmi
parsing/camlinternalMenhirLib.cmo : parsing/camlinternalMenhirLib.cmi
parsing/camlinternalMenhirLib.cmx : parsing/camlinternalMenhirLib.cmi
parsing/camlinternalMenhirLib.cmi :
parsing/depend.cmo : parsing/parsetree.cmi utils/misc.cmi \
parsing/longident.cmi parsing/location.cmi utils/clflags.cmi \
parsing/builtin_attributes.cmi parsing/asttypes.cmi parsing/depend.cmi
@ -102,11 +105,13 @@ parsing/docstrings.cmo : utils/warnings.cmi parsing/parsetree.cmi \
parsing/docstrings.cmx : utils/warnings.cmx parsing/parsetree.cmi \
parsing/location.cmx parsing/docstrings.cmi
parsing/docstrings.cmi : parsing/parsetree.cmi parsing/location.cmi
parsing/lexer.cmo : utils/warnings.cmi parsing/parser.cmi utils/misc.cmi \
parsing/location.cmi parsing/docstrings.cmi parsing/lexer.cmi
parsing/lexer.cmx : utils/warnings.cmx parsing/parser.cmx utils/misc.cmx \
parsing/location.cmx parsing/docstrings.cmx parsing/lexer.cmi
parsing/lexer.cmi : parsing/parser.cmi parsing/location.cmi
parsing/lexer.cmo : utils/warnings.cmi parsing/parser_menhir.cmi \
utils/misc.cmi parsing/location.cmi parsing/docstrings.cmi \
parsing/lexer.cmi
parsing/lexer.cmx : utils/warnings.cmx parsing/parser_menhir.cmx \
utils/misc.cmx parsing/location.cmx parsing/docstrings.cmx \
parsing/lexer.cmi
parsing/lexer.cmi : parsing/parser_menhir.cmi parsing/location.cmi
parsing/location.cmo : utils/warnings.cmi utils/terminfo.cmi utils/misc.cmi \
utils/clflags.cmi utils/build_path_prefix_map.cmi parsing/location.cmi
parsing/location.cmx : utils/warnings.cmx utils/terminfo.cmx utils/misc.cmx \
@ -115,15 +120,12 @@ parsing/location.cmi : utils/warnings.cmi
parsing/longident.cmo : utils/misc.cmi parsing/longident.cmi
parsing/longident.cmx : utils/misc.cmx parsing/longident.cmi
parsing/longident.cmi :
parsing/camlinternalMenhirLib.cmo : parsing/camlinternalMenhirLib.cmi
parsing/camlinternalMenhirLib.cmx : parsing/camlinternalMenhirLib.cmi
parsing/camlinternalMenhirLib.cmi :
parsing/parse.cmo : parsing/syntaxerr.cmi parsing/parser_menhir.cmi \
parsing/parser.cmi parsing/location.cmi parsing/lexer.cmi \
parsing/docstrings.cmi parsing/parse.cmi
parsing/location.cmi parsing/lexer.cmi parsing/docstrings.cmi \
parsing/parse.cmi
parsing/parse.cmx : parsing/syntaxerr.cmx parsing/parser_menhir.cmx \
parsing/parser.cmx parsing/location.cmx parsing/lexer.cmx \
parsing/docstrings.cmx parsing/parse.cmi
parsing/location.cmx parsing/lexer.cmx parsing/docstrings.cmx \
parsing/parse.cmi
parsing/parse.cmi : parsing/parsetree.cmi
parsing/parser.cmo : parsing/syntaxerr.cmi parsing/parsetree.cmi \
parsing/longident.cmi parsing/location.cmi parsing/docstrings.cmi \
@ -136,15 +138,15 @@ parsing/parser.cmx : parsing/syntaxerr.cmx parsing/parsetree.cmi \
parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi \
parsing/docstrings.cmi
parsing/parser_menhir.cmo : parsing/syntaxerr.cmi parsing/parsetree.cmi \
parsing/parser.cmi parsing/camlinternalMenhirLib.cmi parsing/longident.cmi \
parsing/location.cmi parsing/docstrings.cmi utils/clflags.cmi \
parsing/asttypes.cmi parsing/ast_helper.cmi parsing/parser_menhir.cmi
parsing/longident.cmi parsing/location.cmi parsing/docstrings.cmi \
utils/clflags.cmi parsing/camlinternalMenhirLib.cmi parsing/asttypes.cmi \
parsing/ast_helper.cmi parsing/parser_menhir.cmi
parsing/parser_menhir.cmx : parsing/syntaxerr.cmx parsing/parsetree.cmi \
parsing/parser.cmx parsing/camlinternalMenhirLib.cmx parsing/longident.cmx \
parsing/location.cmx parsing/docstrings.cmx utils/clflags.cmx \
parsing/asttypes.cmi parsing/ast_helper.cmx parsing/parser_menhir.cmi
parsing/parser_menhir.cmi : parsing/parsetree.cmi parsing/parser.cmi \
parsing/camlinternalMenhirLib.cmi
parsing/longident.cmx parsing/location.cmx parsing/docstrings.cmx \
utils/clflags.cmx parsing/camlinternalMenhirLib.cmx parsing/asttypes.cmi \
parsing/ast_helper.cmx parsing/parser_menhir.cmi
parsing/parser_menhir.cmi : parsing/parsetree.cmi parsing/location.cmi \
parsing/docstrings.cmi parsing/camlinternalMenhirLib.cmi
parsing/parsetree.cmi : parsing/longident.cmi parsing/location.cmi \
parsing/asttypes.cmi
parsing/pprintast.cmo : parsing/parsetree.cmi utils/misc.cmi \
@ -2394,15 +2396,15 @@ driver/main_args.cmx : utils/warnings.cmx utils/profile.cmx utils/config.cmx \
utils/clflags.cmx driver/main_args.cmi
driver/main_args.cmi :
driver/makedepend.cmo : driver/pparse.cmi parsing/parsetree.cmi \
parsing/parser.cmi parsing/parse.cmi utils/misc.cmi parsing/longident.cmi \
parsing/location.cmi parsing/lexer.cmi parsing/depend.cmi \
utils/config.cmi driver/compplugin.cmi driver/compenv.cmi \
utils/clflags.cmi driver/makedepend.cmi
parsing/parser_menhir.cmi parsing/parse.cmi utils/misc.cmi \
parsing/longident.cmi parsing/location.cmi parsing/lexer.cmi \
parsing/depend.cmi utils/config.cmi driver/compplugin.cmi \
driver/compenv.cmi utils/clflags.cmi driver/makedepend.cmi
driver/makedepend.cmx : driver/pparse.cmx parsing/parsetree.cmi \
parsing/parser.cmx parsing/parse.cmx utils/misc.cmx parsing/longident.cmx \
parsing/location.cmx parsing/lexer.cmx parsing/depend.cmx \
utils/config.cmx driver/compplugin.cmx driver/compenv.cmx \
utils/clflags.cmx driver/makedepend.cmi
parsing/parser_menhir.cmx parsing/parse.cmx utils/misc.cmx \
parsing/longident.cmx parsing/location.cmx parsing/lexer.cmx \
parsing/depend.cmx utils/config.cmx driver/compplugin.cmx \
driver/compenv.cmx utils/clflags.cmx driver/makedepend.cmi
driver/makedepend.cmi :
driver/optcompile.cmo : bytecomp/translmod.cmi bytecomp/simplif.cmi \
utils/profile.cmi bytecomp/printlambda.cmi utils/misc.cmi \

View File

@ -78,7 +78,7 @@ UTILS=utils/config.cmo utils/build_path_prefix_map.cmo utils/misc.cmo \
PARSING=parsing/location.cmo parsing/longident.cmo \
parsing/docstrings.cmo parsing/syntaxerr.cmo \
parsing/ast_helper.cmo parsing/parser.cmo \
parsing/ast_helper.cmo \
parsing/camlinternalMenhirLib.cmo parsing/parser_menhir.cmo \
parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \
parsing/pprintast.cmo \
@ -857,16 +857,6 @@ natruntop:
otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml
$(MAKE) -C otherlibs/dynlink allopt
# The parser
parsing/parser.mli parsing/parser.ml: parsing/parser.mly
$(CAMLYACC) $(YACCFLAGS) $<
partialclean::
rm -f parsing/parser.mli parsing/parser.ml parsing/parser.output
beforedepend:: parsing/parser.mli parsing/parser.ml
# The lexer
parsing/lexer.ml: parsing/lexer.mll

View File

@ -16,7 +16,7 @@
MENHIR ?= menhir
MENHIRFLAGS := --explain --ocamlc "$(CAMLC) $(COMPFLAGS)" --infer\
--lalr --strict --table --external-tokens Parser\
--lalr --strict --table \
--unused-token COMMENT --unused-token DOCSTRING --unused-token EOL\
--unused-token GREATERRBRACKET --fixed-exception
@ -40,12 +40,13 @@ import-menhirLib:
# would be easy to generate a parser and keep an incompatible version of
# menhirLib, which would fail at compile-time.
#
# We assume that parser.ml and parser_menhir.ml depend
# on the same modules, so that the dependency on
# parsing/parser.cmo makes --infer work: the .cmi
# of all modules that parser{_menhir}.mly semantic
# actions depend on have already been built.
promote-menhir: parsing/parser_menhir.mly parsing/parser.cmo
# TODO review this in the wake of yacc parser's removal:
# # We assume that parser.ml and parser_menhir.ml depend
# # on the same modules, so that the dependency on
# # parsing/parser.cmo makes --infer work: the .cmi
# # of all modules that parser{_menhir}.mly semantic
# # actions depend on have already been built.
promote-menhir: parsing/parser_menhir.mly
$(MAKE) import-menhirLib
$(MENHIR) $(MENHIRFLAGS) parsing/parser_menhir.mly
cp $(addprefix parsing/parser_menhir.,ml mli) boot/menhir

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,126 @@
(* The type of tokens. *)
type token = Parser.token
type token =
| WITH
| WHILE
| WHEN
| VIRTUAL
| VAL
| UNDERSCORE
| UIDENT of (string)
| TYPE
| TRY
| TRUE
| TO
| TILDE
| THEN
| STRUCT
| STRING of (string * string option)
| STAR
| SIG
| SEMISEMI
| SEMI
| RPAREN
| REC
| RBRACKET
| RBRACE
| QUOTE
| QUESTION
| PRIVATE
| PREFIXOP of (string)
| PLUSEQ
| PLUSDOT
| PLUS
| PERCENT
| OR
| OPTLABEL of (string)
| OPEN
| OF
| OBJECT
| NONREC
| NEW
| MUTABLE
| MODULE
| MINUSGREATER
| MINUSDOT
| MINUS
| METHOD
| MATCH
| LPAREN
| LIDENT of (string)
| LET
| LESSMINUS
| LESS
| LBRACKETPERCENTPERCENT
| LBRACKETPERCENT
| LBRACKETLESS
| LBRACKETGREATER
| LBRACKETBAR
| LBRACKETATATAT
| LBRACKETATAT
| LBRACKETAT
| LBRACKET
| LBRACELESS
| LBRACE
| LAZY
| LABEL of (string)
| INT of (string * char option)
| INITIALIZER
| INHERIT
| INFIXOP4 of (string)
| INFIXOP3 of (string)
| INFIXOP2 of (string)
| INFIXOP1 of (string)
| INFIXOP0 of (string)
| INCLUDE
| IN
| IF
| HASHOP of (string)
| HASH
| GREATERRBRACKET
| GREATERRBRACE
| GREATER
| FUNCTOR
| FUNCTION
| FUN
| FOR
| FLOAT of (string * char option)
| FALSE
| EXTERNAL
| EXCEPTION
| EQUAL
| EOL
| EOF
| END
| ELSE
| DOWNTO
| DOTOP of (string)
| DOTDOT
| DOT
| DONE
| DOCSTRING of (Docstrings.docstring)
| DO
| CONSTRAINT
| COMMENT of (string * Location.t)
| COMMA
| COLONGREATER
| COLONEQUAL
| COLONCOLON
| COLON
| CLASS
| CHAR of (char)
| BEGIN
| BARRBRACKET
| BARBAR
| BAR
| BANG
| BACKQUOTE
| ASSERT
| AS
| AND
| AMPERSAND
| AMPERAMPER
(* This exception is raised by the monolithic API functions. *)

View File

@ -236,6 +236,7 @@ let rec lexical_approximation lexbuf =
- always skip the token after a backquote
*)
try
let module Parser = Parser_menhir in
let rec process after_lident lexbuf =
match Lexer.token lexbuf with
| Parser.UIDENT name ->

View File

@ -165,11 +165,6 @@ let parse (type a) (kind : a ast_kind) lexbuf : a =
| Structure -> Parse.implementation lexbuf
| Signature -> Parse.interface lexbuf
let parse_menhir (type a) (kind : a ast_kind) lexbuf : a =
match kind with
| Structure -> Parse.implementation_menhir lexbuf
| Signature -> Parse.interface_menhir lexbuf
let file_aux ~tool_name inputfile (type a) parse_fun invariant_fun
(kind : a ast_kind) : a =
let ast_magic = magic_of_kind kind in
@ -256,7 +251,6 @@ module InterfaceHooks = Misc.MakeHooks(struct
type t = Parsetree.signature
end)
let yacc = "yacc"
let menhir = "menhir"
let choose_parsers parser_table =
@ -279,8 +273,7 @@ let choose_parsers parser_table =
let parse_implementation ~tool_name sourcefile =
let parse = choose_parsers [
(yacc, parse Structure);
(menhir, parse_menhir Structure)
(menhir, parse Structure)
] in
parse_file ~tool_name Ast_invariants.structure
parse Printast.implementation Structure sourcefile
@ -288,8 +281,7 @@ let parse_implementation ~tool_name sourcefile =
let parse_interface ~tool_name sourcefile =
let parse = choose_parsers [
(yacc, parse Signature);
(menhir, parse_menhir Signature)
(menhir, parse Signature)
] in
parse_file ~tool_name Ast_invariants.signature
parse Printast.interface Signature sourcefile

View File

@ -16,7 +16,7 @@
(* The lexical analyzer *)
val init : unit -> unit
val token: Lexing.lexbuf -> Parser.token
val token: Lexing.lexbuf -> Parser_menhir.token
val skip_hash_bang: Lexing.lexbuf -> unit
type error =
@ -39,7 +39,7 @@ val in_string : unit -> bool;;
val print_warnings : bool ref
val handle_docstrings: bool ref
val comments : unit -> (string * Location.t) list
val token_with_comments : Lexing.lexbuf -> Parser.token
val token_with_comments : Lexing.lexbuf -> Parser_menhir.token
(*
[set_preprocessor init preprocessor] registers [init] as the function
@ -54,5 +54,5 @@ changes its behavior to accept backslash-newline as a token-separating blank.
val set_preprocessor :
(unit -> unit) ->
((Lexing.lexbuf -> Parser.token) -> Lexing.lexbuf -> Parser.token) ->
((Lexing.lexbuf -> Parser_menhir.token) -> Lexing.lexbuf -> Parser_menhir.token) ->
unit

View File

@ -18,7 +18,7 @@
{
open Lexing
open Misc
open Parser
open Parser_menhir
type error =
| Illegal_character of char

View File

@ -17,6 +17,8 @@
(* Skip tokens to the end of the phrase *)
module Parser = Parser_menhir
let last_token = ref Parser.EOF
let token lexbuf =
@ -63,17 +65,6 @@ let wrap parsing_fun lexbuf =
then maybe_skip_phrase lexbuf;
raise(Syntaxerr.Error(Syntaxerr.Other loc))
let wrap_yacc parsing_fun =
wrap (fun lexbuf -> parsing_fun token lexbuf)
let implementation = wrap_yacc Parser.implementation
and interface = wrap_yacc Parser.interface
and toplevel_phrase = wrap_yacc Parser.toplevel_phrase
and use_file = wrap_yacc Parser.use_file
and core_type = wrap_yacc Parser.parse_core_type
and expression = wrap_yacc Parser.parse_expression
and pattern = wrap_yacc Parser.parse_pattern
let rec loop lexbuf in_error checkpoint =
let module I = Parser_menhir.MenhirInterpreter in
match checkpoint with
@ -123,10 +114,10 @@ let wrap_menhir entry lexbuf =
let initial = entry lexbuf.Lexing.lex_curr_p in
wrap (fun lexbuf -> loop lexbuf false initial) lexbuf
let implementation_menhir = wrap_menhir Parser_menhir.Incremental.implementation
and interface_menhir = wrap_menhir Parser_menhir.Incremental.interface
and toplevel_phrase_menhir = wrap_menhir Parser_menhir.Incremental.toplevel_phrase
and use_file_menhir = wrap_menhir Parser_menhir.Incremental.use_file
and core_type_menhir = wrap_menhir Parser_menhir.Incremental.parse_core_type
and expression_menhir = wrap_menhir Parser_menhir.Incremental.parse_expression
and pattern_menhir = wrap_menhir Parser_menhir.Incremental.parse_pattern
let implementation = wrap_menhir Parser_menhir.Incremental.implementation
and interface = wrap_menhir Parser_menhir.Incremental.interface
and toplevel_phrase = wrap_menhir Parser_menhir.Incremental.toplevel_phrase
and use_file = wrap_menhir Parser_menhir.Incremental.use_file
and core_type = wrap_menhir Parser_menhir.Incremental.parse_core_type
and expression = wrap_menhir Parser_menhir.Incremental.parse_expression
and pattern = wrap_menhir Parser_menhir.Incremental.parse_pattern

View File

@ -22,11 +22,3 @@ val use_file : Lexing.lexbuf -> Parsetree.toplevel_phrase list
val core_type : Lexing.lexbuf -> Parsetree.core_type
val expression : Lexing.lexbuf -> Parsetree.expression
val pattern : Lexing.lexbuf -> Parsetree.pattern
val implementation_menhir : Lexing.lexbuf -> Parsetree.structure
val interface_menhir : Lexing.lexbuf -> Parsetree.signature
val toplevel_phrase_menhir : Lexing.lexbuf -> Parsetree.toplevel_phrase
val use_file_menhir : Lexing.lexbuf -> Parsetree.toplevel_phrase list
val core_type_menhir : Lexing.lexbuf -> Parsetree.core_type
val expression_menhir : Lexing.lexbuf -> Parsetree.expression
val pattern_menhir : Lexing.lexbuf -> Parsetree.pattern

File diff suppressed because it is too large Load Diff

View File

@ -114,8 +114,8 @@ let remove_printer = Printer.remove_printer
(* Hooks for parsing functions *)
let parse_toplevel_phrase = ref Parse.toplevel_phrase_menhir
let parse_use_file = ref Parse.use_file_menhir
let parse_toplevel_phrase = ref Parse.toplevel_phrase
let parse_use_file = ref Parse.use_file
let print_location = Location.print_loc
let print_error = Location.print_report
let print_warning = Location.print_warning