[antlr-interest] Re: a new paper on ANTLR style grammars

Thomas Brandon tom at psy.unsw.edu.au
Fri Nov 21 01:01:53 PST 2003


Yeah, that's the Antlr solution. And I think that some of Ter's new 
stuff is looking at doing stuff kinda like that automatically. It 
just figures out the k it will need (or that it can't find a k that 
will work) so you don't explicitly need to tell it through a 
syntactic predicate.

If I understand it correctly, the real problem with actions is in LR 
parsers where matching is down on the right-edge of rules, and they 
don't support such predicates as they are table-based. They wait 
until the right edge of a rule to match, so it's a bit like the 
parser is in guessing mode for the entire rule, thus any actions are 
ignored. And, unlike Antlr, they don't allow you to figure out 
through predicated guessing whether the rule should run and then run 
it properly with actions.

Tom.
--- In antlr-interest at yahoogroups.com, "Arnar Birgisson" 
<arnarb at o...> wrote:
> Hi there,
> 
> Mabey this is obvious, but if the parser-generator could identify 
such
> cases, i.e. 
> 
> a: A A { bSomething == true; } A { if(bSomething) ...; } A B;
> b: A A { bSomething == false; } A { if(bSomething) ...; } A C;
> 
> and it can hadle syntactic predicates, it would automatically 
change
> this to
> 
> a: (A A A A B)=> A A { bSomething == true; } A { if
(bSomething) ..; } A
> B;
> b: (A A A A C)=> A A { bSomething == false; } A { if
(bSomething) ..; }
> A C;
> 
> do the job? It would obviously hurt performance though, but such 
cases
> should be rare.
> 
> Arnar
> 
> > -----Original Message-----
> > From: Thomas Brandon [mailto:tom at p...] 
> > Sent: 21. nóvember 2003 06:51
> > To: antlr-interest at yahoogroups.com
> > Subject: [antlr-interest] Re: a new paper on ANTLR style grammars
> > 
> > 
> > Oliver,
> > I don't think doing all actions and then rolling back is going 
to be 
> > enough. Remember that by itself the example you present is no 
> > problem for LR, just use:
> > ab: A A A A (B { Action1(); } | C { Action2(); });
> > of course I assume you intended something like:
> > a: A A { bSomething == true; } A { if(bSomething) ...; } A B;
> > b: A A { bSomething == false; } A { if(bSomething) ...; } A C;
> > i.e. we must decide before we see the B|C, as actions are not 
edge-
> > aligned. (Though presumably we are doing more than simply 
setting 
> > flags).
> > 
> > But in this case how are transactions going to work? We execute 
both 
> > bSomething = true and bSomething = false? No, I think we're 
going to 
> > need to branch the entire state, in one we do bSomething = true; 
in 
> > the other bSomething = false;. Now were either gonna need to do 
two 
> > complete parses of the rest of the input or parse once but for 
every 
> > subsequent action execute it against all valid states. Of course 
> > once the path we take branches then were going to need to branch 
our 
> > states for each path too.
> > 
> > If instead our grammar was:
> > a: A A { bSomething == true; } A { if(bSomething) ...; else if 
> > bSomethingElse) ...;} A B;
> > b: A A { bSomethingElse == true; } A { if(bSomething) ...; else 
if
> > (bSomethingElse) ...;} A C;
> > where there is no overlap between the two actions, then we 
wouldn't 
> > need to. But I don't think the semantic analysis necessary to 
> > distinguish those cases is trivial (given ithings like the 
> > possibility that bSomething == bSomethingElse). Similarly 
> > transforming to the benign form may be possible but would 
require 
> > such analysis. And even if you do manage the analysis it means 
you 
> > need to redo the entire analysis when anything changes. i.e. if 
my 
> > action is myClass.MyAction() then we need to redo the entire 
> > analysis if myClass.MyAction changes, hence no inheritance 
without 
> > possibly breaking things.
> > 
> > And what about when actions overlap, i.e. we have a choice 
between 
> > an action { a = 3; b++; } and { a = 4; b++; c++; }, we can't 
just 
> > store the inital state and later restore it because if we 
restore 
> > that we undo both actions. Somehow we need to figure out for our 
> > actions A and B, A union B (those changes common to both) and A -
 B 
> > and B - A, those changes peculiar to B and those peculiar to A. 
> > Then, if we want A to go through we only rollback B - A (those 
> > changes peculiar to B). Again requiring (probably quite 
> > sophisticated) static analysis.
> > 
> > Tom.
> > --- In antlr-interest at yahoogroups.com, "Oliver Zeigermann" 
> > <oliver at z...> wrote:
> > > What I wanted to say was: If you have sematic actions 
associated to
> > > your grammar that can be inserted (and of course executed) at 
any
> > > point and you have a table driven approach you are in trouble. 
> > This is
> > > because what I understand as the precomputation of a search 
tree 
> > into
> > > a table combining certain *search* states. Extrapolating from 
what 
> > I
> > > know about LR you have a problem when youe have a grammar like 
> > this:
> > > 
> > > a : A A { do something here } A A B ;
> > > b : A A { do something different here } A A C ;
> > > 
> > > upon input
> > > 
> > > AAAAC
> > > 
> > > This is because the parser has no idea which action to execute 
> > here.
> > > Now, my idea was to execute both and roll back the action of 
rule 
> > a as
> > > soon as it is clear that rule b actually matches.
> > > 
> > > A bit clearer now?
> > > 
> > > Oliver
> > > 
> > > --- In antlr-interest at yahoogroups.com, Terence Parr 
<parrt at c...> 
> > wrote:
> > > > 
> > > > On Wednesday, November 19, 2003, at 03:12 PM, Oliver 
Zeigermann 
> > wrote:
> > > > 
> > > > > Actually made it through the paper while getting nervous 
with 
> > the
> > > > > proofs ;)
> > > > >
> > > > > While he has linear time "backtracking" performance, ANTLR 
is 
> > worst
> > > > > case exponential. I was wondering why: ANTLR does not 
combine 
> > its
> > > > > depth first search (aka backtracking in this context) into 
a 
> > table
> > > > > while Bryan's approach does (at least I understand it this 
> > way). The
> > > > > problem Bryan will come across (given my understanding is 
> > halfway
> > > > > correct) is ACTIONS. As with LR and combined states, the 
> > problem is
> > > > > when to execute associated semantic actions. The drawback 
is 
> > well
> > > > > known and and leads to reduction in parsing power.
> > > > >
> > > > > Might sound weird, but I thought if we still combined 
states 
> > even
> > > > > though they are associated with different actions and 
simple 
> > execute
> > > > > all actions, there would be no loss of power :) Silly? Not 
if 
> > you have
> > > > > a transactional language that allows you to roll back 
actions 
> > that
> > > > > turn out to be invalid later and roll forward the valid 
ones.
> > > > >
> > > > > Technically this is possible. Does it make sense as well? 
Am I 
> > slowly
> > > > > going crazy? ;)
> > > > 
> > > > You are already crazy like me ;) <snicker, snort>.  Just got 
> > mail from 
> > > > him. :)  Hope it's ok to repeat part here:
> > > > 
> > > > > - Packrat parsing guarantees linear-time parsing on all 
the 
> > types of 
> > > > > grammars
> > > > > it supports, which amounts to everything that fits the 
> > formalism or
> > > > > "conceptual model" of parsing expression grammars.  But 
> > the "pure"
> > > PEG 
> > > > > model
> > > > > doesn't directly support "stateful" grammars like those of 
C 
> > and C++, 
> > > > > in
> > > > > which you have to build up symbol tables and such that 
> > effectively 
> > > > > modify the
> > > > > grammar mid-stream as the parser scans the input from left 
to 
> > right.  
> > > > > From
> > > > > what I've seen so far, it appears fundamentally difficult 
or 
> > > > > impossible to
> > > > > make a packrat parser support stateful grammars 
efficiently 
> > without
> > > > > effectively turning it into a deterministic (e.g., LR) 
parser.
> > > > 
> > > > So, the actions are the problem for everyone :)
> > > > 
> > > > Ter
> > > > --
> > > > Professor Comp. Sci., University of San Francisco
> > > > Creator, ANTLR Parser Generator, http://www.antlr.org
> > > > Co-founder, http://www.jguru.com
> > > > Co-founder, http://www.knowspam.net enjoy email again!
> > > > Co-founder, http://www.peerscope.com pure link sharing
> > 
> > 
> >  
> > 
> > Your use of Yahoo! Groups is subject to 
> > http://docs.yahoo.com/info/terms/ 
> > 
> >


 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 




More information about the antlr-interest mailing list