I read about syntatic predicates in TP's book.  And looking over the online
docs, I can't really find where they are explained either.  A google search
did turn up this article
http://www.antlr.org/wiki/display/ANTLR3/How+to+remove+global+backtracking+f
rom+your+grammar 
 
which looks like it might answer some of your questions.
 
Dave
 


  _____  

From: Mark Taylor [mailto:[email protected]] 
Sent: Thursday, June 11, 2009 9:34 AM
To: Dave Dutcher
Cc: [email protected]
Subject: Re: [antlr-interest] Again Cobol:


Dave: Yes, Cobol is that evil.  The period closes all previous scopes that
don't require explicit scope terminators (some constructs like PERFORM do,
some don't (COMPUTE)).  Thanks, that worked.  I replaced the PERFORM rule
with:

perform:     'perform' ((stmt)=>stmt)+ 'end-perform' ;

and I no longer get the error.

Now some rhetorical questions: why does it work?  Or, why is it not obvious?
Where are syntactic predicates explained?  Is this in the online docs
somewhere I can't find?  Clearly I have some studying to do.  I haven't
picked up T.P.s book yet but I aim too.  




On Thu, Jun 11, 2009 at 8:42 AM, Dave Dutcher <[email protected]> wrote:


I'm new to Antlr myself, so maybe you already know everything I'm going to
suggest.
 
So your grammar has trouble with input like
 
if A == B then move Y to Z move X to Y.
 
And you're suggesting that the parser should just consume the move X to Y as
part of the if statement, even though it could also be interpreted as
another seperate statement?  This reminds me of the classic IF IF ELSE
problem, but I don't have my Antlr book with me to lookup how that is
usually solved.
 
One method might be to just turn on backtracking.  Otherwise I would think
you could add syntatic predicates like ((stmt)=>stmt)+ which, as I
understand it, would make Antlr consume all the statements it can as that
part of the rule.  I haven't tested this though.
 
Dave
 
 



  _____  

From: [email protected]
[mailto:[email protected]] On Behalf Of Mark Taylor
Sent: Thursday, June 11, 2009 7:39 AM
To: [email protected]
Subject: [antlr-interest] Again Cobol:


I'm working on a Cobol grammar (oh, the foolishness of youth...  wait I'm
not THAT young...) and I need some advice about the ambiguities.  In
particular I'm getting the famous: "error(211): CobolTest.g:11:30: [fatal]
rule if has non-LL(*) decision due to recursive rule invocations reachable
from alts 1,2.  Resolve by left-factoring or using syntactic predicates or
using backtrack=true option."  Yes, this has come up before, but there was
no clear answer.  This time I have a specific example (see below).

Below is the smallest grammar which exhibits the problem.  You can see I
have stmt+ in both the IF rule and the PERFORM rule.  The problem is the
'END-IF'?.  Since END-IF is optional in Cobol, there is no clear scope
terminator.   I've tried left refactoring the (stmt+ ....) into a separate
rule for both IF and PERFORM but that doesn't seem to work either.  I don't
see how a syntactic predicate could be applied to this either.

If I were writing this as a recursive descent parser by hand (I'm trying
Antlr so I don't have to do this) I would write a statementlist() method
that would simply loop on all statement beginnings keywords.  Then when an
END-IF, ELSE, END-PERFORM, or some other arbitrary scope terminator appeared
in the input the loop would simple exit and return the list of valid
statements.  The question is: how to get Antlr to behave like this?

Any advice is appreciated.

<pre>

grammar CobolTest;

program:     sentence+ EOF;

sentence:    stmt+ '.' ;

stmt:        if
        |    move 
        |   perform ;

if:            'if' condition 'then'? stmt+ ('else' stmt+)? 'end-if'? ;

move:        'move' ID 'to' ID ;

perform:     'perform' stmt+ 'end-perform' ;

condition:     ID '==' ID ;

ID  :       ('a'..'z'|'A'..'Z')+ ;
INT :       '0'..'9'+ ;
NEWLINE:    '\r'? '\n' {skip();} ;
WS  :       (' '|'\t')+ {skip();} ;

</pre>




--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en
-~----------~----~----~----~------~----~------~--~---

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

Reply via email to