Thanks so much. I guess I was looking for something complicated in how I wrote the EBNF. I used the same parser (with your modification) on a much more complicated example and it also worked. So, this was very helpful.
I will look at your other suggestion as well. I like people with an opinion (nitpicky or not)!! I appreciate your quick response. Thanks again I also appreciate Kirby taking the time to make suggestions. While his "suspicion" wasn't correct, I still appreciate the comments as it will help me learn. Cheers to you both. I'll get back to trying to understand Mr. Parr's books. :-) Scott -----Original Message----- From: John B. Brodie [mailto:[email protected]] Sent: Tuesday, August 02, 2011 7:02 PM To: Scott Smith Cc: [email protected] Subject: Re: [antlr-interest] Help with a parser Greetings! On Tue, 2011-08-02 at 23:11 +0000, Scott Smith wrote: > I assume this is the proper place to put this. I'm trying to build a parser > for filters generated by SOLR (lucene.apache.org). i think this is exactly the correct place to post questions of this kind. > > Examples of valid "sentences" the parser should parse are: > > fq = fred > > fq = (fred OR bill) > > fq = harry:(fred OR bill) > > fq = (harry:fred OR jack:bill) > > fq = ((harry:fred OR bill) AND (jane OR marry:sally)) > > terms can be nested to arbitrary levels. The colon really binds to the word > before it (e.g., "harry:"). > > I've listed the parser below (which doesn't work). Can someone suggest what > I can do? It seems like a simple problem, but so far I haven't cracked it. > I will admit that I've only been playing with Antlr the last week or so. I > did play all of Scott Stanchfield's excellent videos on vimeo. But, still > I'm confused. > > When I run the parser in antlrworks with example 3 ("fq = harry:(fred OR > bill)" - no quote marks), it finds "fq = harry:(fred" and then it wants the > right paren instead of expanding out the filter_expr rule. What am I missing? I assume you are using the Interpreter in ANTLRWorks and not the Debugger. If so, do not do that. ANTLRWorks' interpreter has a few quirks. I do not use ANTLRWorks so can not really say for sure but I think using the Debugger is the perferred way to go when using ANTLRWorks. Your grammar, with just 1 change, operates just as you expect when Tool'd, Compiled, and Executed from the command line. Your WS rule needs some parens to group the characters to be hidden --- due to ANTLR's meta-operator precedence for actions vs alternatives. So replace your WS rule with this: WS : (' ' | '\t' | '\n' | '\r' | '\u3000') {$channel=HIDDEN; } ; and it just works. I can post my test driver if you want... oh and a small nitpick. the concept of KEYWORD usually equates to a reserved word in the language (like your AND and OR and NOT). I would suggest that the concept of IDENTIFIER more closely matches what you have as keyword. Just nitpicking, sorry.... Hope this helps. -jbb > Thanks > > Scott > > Here's the parser. > > grammar testGrammer; > > options { > language = Java; > } > > @header { > package a.b.c; > } > > @lexer::header { > package a.b.c; > } > > filter: > 'fq' '=' filter_expr EOF > ; > > term > : KEYWORD > | STRING > | '(' filter_expr ')' > ; > > fieldname > : FIELDNAME? term > ; > > > filter_expr: > fieldname (((AND | OR | NOT))? fieldname)* > ; > > FIELDNAME > : KEYWORD ':' ; > > AND : 'AND' | '&&' ; > OR : 'OR' | '||' ; > NOT : 'NOT' | '!' ; > KEYWORD : LETTER (LETTER | NUM_CHAR | '_')*; STRING : '"' > NONCONTROL_CHAR* '"' ; WS : ' ' | '\t' | '\n' | '\r' | '\u3000' > {$channel=HIDDEN; } ; > > fragment NONCONTROL_CHAR: LETTER | NUM_CHAR | SPACE | SYMBOL; fragment > SYMBOL: ' '..'!' | '#'..'/' | ':'..'@' | '['..'`' | '{'..'~'; > fragment LETTER: LOWER | UPPER; fragment LOWER: 'a'..'z'; fragment > UPPER: 'A'..'Z'; fragment NUM_CHAR: '0'..'9'; fragment SPACE: ' ' | > '\t'; List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address -- 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.
