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
