Commit c15ac728 authored by POTTIER Francois's avatar POTTIER Francois

Left-to-right sweep: avoid searching in places that have been searched already.

parent a88befe5
...@@ -15,6 +15,8 @@ let position = Positions.position ...@@ -15,6 +15,8 @@ let position = Positions.position
open Keyword open Keyword
open UnparameterizedSyntax open UnparameterizedSyntax
open ListMonad open ListMonad
let drop = MenhirLib.General.drop
let take = MenhirLib.General.take
(* [search p i xs] searches the list [xs] for an element [x] that satisfies [p]. (* [search p i xs] searches the list [xs] for an element [x] that satisfies [p].
If successful, then it returns a pair of 1. [i] plus the offset of [x] in the If successful, then it returns a pair of 1. [i] plus the offset of [x] in the
...@@ -184,8 +186,8 @@ let inline_branch caller (site : site) (callee : branch) : branch = ...@@ -184,8 +186,8 @@ let inline_branch caller (site : site) (callee : branch) : branch =
let ncaller = List.length caller.producers in let ncaller = List.length caller.producers in
let nsuffix = ncaller - (i + 1) in let nsuffix = ncaller - (i + 1) in
let prefix = MenhirLib.General.take nprefix caller.producers let prefix = take nprefix caller.producers
and suffix = MenhirLib.General.drop (nprefix + 1) caller.producers in and suffix = drop (nprefix + 1) caller.producers in
(* 2015/11/18. The interaction of %prec and %inline is not documented. (* 2015/11/18. The interaction of %prec and %inline is not documented.
It used to be the case that we would disallow marking a production It used to be the case that we would disallow marking a production
...@@ -338,15 +340,18 @@ let transform_branches f rule = ...@@ -338,15 +340,18 @@ let transform_branches f rule =
that can be inlined. *) that can be inlined. *)
let inline grammar = let inline grammar =
let rec expand_branches expand_symbol branches : branches = let rec expand_branches expand_symbol i branches : branches =
(* For each branch [caller] in the list [branches], *) (* For each branch [caller] in the list [branches], *)
branches >>= fun (caller : branch) -> branches >>= fun (caller : branch) ->
(* Search for an inlining site in the branch [caller]. *) (* Search for an inlining site in the branch [caller]. We begin the
match search (is_inline_producer grammar) 0 caller.producers with search at position [i], as we know that every inlining site left
of this position has been dealt with already. *)
let producers = drop i caller.producers in
match search (is_inline_producer grammar) i producers with
| None -> | None ->
(* There is none; we are done. *) (* There is none; we are done. *)
return caller return caller
| Some ((_i, producer) as site) -> | Some ((i, producer) as site) ->
(* There is one. This is an occurrence of a nonterminal symbol (* There is one. This is an occurrence of a nonterminal symbol
[symbol] that is marked %inline. We look up its (expanded) [symbol] that is marked %inline. We look up its (expanded)
definition (via a recursive call to [expand_symbol]), yielding definition (via a recursive call to [expand_symbol]), yielding
...@@ -357,12 +362,12 @@ let inline grammar = ...@@ -357,12 +362,12 @@ let inline grammar =
expand_symbol symbol expand_symbol symbol
|> get_branches |> get_branches
|> inline_branches caller site |> inline_branches caller site
|> expand_branches expand_symbol |> expand_branches expand_symbol i
in in
let expand_symbol expand_symbol symbol : rule = let expand_symbol expand_symbol symbol : rule =
find grammar symbol find grammar symbol
|> transform_branches (expand_branches expand_symbol) |> transform_branches (expand_branches expand_symbol 0)
in in
let expand_symbol : Syntax.symbol -> rule = let expand_symbol : Syntax.symbol -> rule =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment