[antlr-interest] parsing boolean expressions: not not or abc

Scott Stanchfield scott at javadude.com
Thu Jan 14 09:47:55 PST 2010


Good catch on changing the type of the token; I had forgotten to do
that on the note I sent...
-- Scott

----------------------------------------
Scott Stanchfield
http://javadude.com



On Thu, Jan 14, 2010 at 11:59 AM, Jim Idle <jimi at temporal-wave.com> wrote:
> Change your grammar to:
>
> grammar T;
> options {
>        output=AST;
> }
> tokens {
>        EXPR;
> }
>
> content :       orexpression EOF
>                ->^(EXPR orexpression)
>        ;
>
> orexpression
>        :       andexpression (OR^ andexpression)*
>        ;
> andexpression
>        :       expression (AND^ expression)*
>        ;
> expression
>        :       (NOT^)? term
>        ;
> term    : (
>                  t=WORD
>                | t=AND
>                | t=OR
>                | t=NOT
>          )
>          {
>                $t.setType(WORD);
>          }
>        ;
>
> NOT     :       'not'
>        ;
> AND     :       'and'
>        ;
> OR      :       'or'
>        ;
> WORD    :       ('a'..'z' | '0'..'9' | '%' | '_')+
>        ;
> WS      :       (' ' | '\r' | '\n' | '\t')  { skip(); }
>
>
> However note that the grammar has to make some assumptions here such as the word 'not' on its own is a term and not (pun not intended) a syntax error where the not is the operator and should expect a term.
>
> Also I suspect that your not processing rule should actually be:
>
> expression
>        :       NOT^ expression
>        |       term
>        ;
>
> But this would eat not not not as a repeated not as in NOT NOT WORD
>
> If the expression rule gets more complicated then ANTLR may not be able to predict properly.
>
> Jim
>
>> -----Original Message-----
>> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
>> bounces at antlr.org] On Behalf Of lord.of.board at gmx.de
>> Sent: Thursday, January 14, 2010 1:10 AM
>> To: antlr-interest at antlr.org
>> Subject: [antlr-interest] parsing boolean expressions: not not or abc
>>
>> Hello,
>>
>> I am trying to build a grammar which accepts boolean expressions for
>> filtering. I found some interesting articles on the web, but now I got
>> stuck.
>> I try to parse something like this:
>>
>>   not not or abc
>>
>> The first "not" is the boolean operator and the second is a text.
>>
>> Or even worse
>>
>>   not not and not or and not and
>>
>> My grammar look like this:
>>
>> grammar TextFilterGrammar;
>> options {
>>       output=AST;
>> }
>> content :     orexpression
>>       ;
>> orexpression
>>       :       andexpression (OR^ andexpression)*
>>       ;
>> andexpression
>>       :       expression (AND^ expression)*
>>       ;
>> expression
>>       :       (NOT^)? term
>>       ;
>> term  :       WORD
>>       ;
>>
>> NOT   :       'not'
>>       ;
>> AND   :       'and'
>>       ;
>> OR    :       'or'
>>       ;
>> WORD  :       ('a'..'z' | '0'..'9' | '%' | '_')+
>>       ;
>> WS    :       (' ' | '\r' | '\n' | '\t')  { skip(); }
>>       ;
>>
>> In ANTLRWorks I always get a MismatchedTokenException when trying to
>> parse "not not or ljsdf". Parsing e.g. "not noti or ljsdf" works fine.
>>
>> I managed to get it working with quotation marks, but I would prefer to
>> have a solution without.
>>
>> Best regards,
>> Lordi
>>
>> --
>> GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
>> Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01
>>
>> List: http://www.antlr.org/mailman/listinfo/antlr-interest
>> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-
>> email-address
>
>
>
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>


More information about the antlr-interest mailing list