Patrick~ On 10/10/05, Patrick R. Michaud <[EMAIL PROTECTED]> wrote: > On Mon, Oct 10, 2005 at 09:11:02AM -0400, Matt Fowles wrote: > > Patrick~ > > > > The theoretical implementation of this is quite simple. Keep a > > counter. everytime a token is consumed from the input stream reset it. > > Every time a rule is followed increment the counter. If the counter > > is ever greater than the number of productions in the grammer, then > > you have gone into infinite recursion. > > What happens with something like: > > rule atom { A } > rule binary { . <atom> | <expr> \* <atom> } > rule expr { <binary> } > > "AB" ~~ / <expr> / > > Here, the '.' in <binary> keeps "consuming" the initial "A" (thus > resetting the counter), but the <atom> rule fails, so we take > the alternation which recurses back to <expr> and does the whole > thing all over again (with the counter having been reset to zero). > So I guess we'd need to backtrack the counter as well...? > > Perhaps what we want to be watching is "positions", so that we detect > when the depth of nested subrules activated from a common input position > is greater than the total number of defined rules? > > And, of course, in the case of rules containing closures, all bets > should be off for detecting infinite recursion, since the closure > could be handling the termination of the recursion based on some > criteria other than tokens consumed from the input stream. (But it's > also probably easy to know when we've executed a closure and thus > disable the check for infinite recursion when that happens.)
You are right about backtracking, rather than a simple counter we need to keep track of the current recursion depth from a particular position. I agree that we would have to disable this for rules containing code. Perhaps a better approach would be to perform a bit of static analysis on the grammar and look for left recursions at creation time (I believe that is a known problem). Then we can just warn once up front and go on our merry way recursing at matchtime. Matt -- "Computer Science is merely the post-Turing Decline of Formal Systems Theory." -Stan Kelly-Bootle, The Devil's DP Dictionary