[antlr-interest] How to do "not" in a syntactic predicate?

Indhu Bharathi indhu.b at s7software.com
Wed Oct 14 11:35:00 PDT 2009


Here is the complete grammar:

 

grammar Test;

 

q             :               a ((b)=>NOWAY | /*nothing*/);

 

a              :               'asd';

b             :               'qwe';

 

fragment NOWAY:          ;

 

 

'q' will accept "asd" but not "asdqwe". Am I missing something?

 

 

BTW, if you can post a simplified example of your exact problem, you might
get more elegant solutions. This is only a hack for the specific problem you
posted. Maybe your original problem can be solved in a more elegant way.
Cases that require hacks of this kind are very rare and arises only while
parsing some very obscure languages. 

 

Cheers, Indhu

 

 

From: Naveen Chawla [mailto:naveen.chwl at googlemail.com] 
Sent: Wednesday, October 14, 2009 11:38 PM
To: Indhu Bharathi
Cc: Jim Idle; antlr-interest at antlr.org
Subject: Re: [antlr-interest] How to do "not" in a syntactic predicate?

 

Yikes, that doesn't seem to work, it seems to give a normal positive
predicate for me. (Or something). But not "if a not followed by b" => a.

 

?

2009/10/14 Indhu Bharathi <indhu.b at s7software.com>

The other say I replied from my ipod and was not able to test it with ANTLR.
I checked it now and the code doesn't work for me too. However you can try a
variant:

 

q             :               a ((b)=>NOWAY | /*nothing*/)

                ;

 

fragment NOWAY

                :               ;

 

This is tested J But note that this is only a hack and use it only when
there is no other alternative. 

 

Going by your "one of my "smaller" rules is "consuming" something that
should belong to a "larger" rule" description, it looks like you can solve
that problem by turning off greedy. Grep for 'greedy' in the book or wiki.

 

Cheers, Indhu

 

 

From: antlr-interest-bounces at antlr.org
[mailto:antlr-interest-bounces at antlr.org] On Behalf Of Naveen Chawla
Sent: Wednesday, October 14, 2009 3:50 PM
To: Jim Idle
Cc: antlr-interest at antlr.org
Subject: Re: [antlr-interest] How to do "not" in a syntactic predicate?

 

Jim, being new to predicates I realised soon after this that you were
talking about token lookaheads. And yes I do need a syntactic lookahead (but
thas is negative). In beginner-speak, one of my "smaller" rules is
"consuming" something that should belong to a "larger" rule. This would be
correct if that particular something (e.g. "a") was *not* followed by a
syntactic construct conforming to "b". Hence (a !b)=>a (for the smaller
rule) seems the simplest solution to this to me. Is Indhu's version correct
for doing this trick? It doesn't seem to work for me (but I might be doing
something else wrong). If not correct, what is the correct way? My target is
Java.

2009/10/5 Jim Idle <jimi at temporal-wave.com>

Use a semantic predicate rather than syntactic. You possibly need a bated
predicate here too:

 

{ input.LA(1) == A && input.LA(2) != B}?=>

 

However, if you need that kind of syntactic predicate, then I suggest you
may be approaching your problem incorrectly.

 

Jim

 

From: antlr-interest-bounces at antlr.org
[mailto:antlr-interest-bounces at antlr.org] On Behalf Of Naveen Chawla
Sent: Monday, October 05, 2009 7:02 AM 


To: antlr-interest at antlr.org
Subject: [antlr-interest] How to do "not" in a syntactic predicate?

 

If I do

 

(a ~b)=> a

 

meaning "take this alternative if you encounter an a when not followed by b"

 

I get a syntax error: unexpected token b

Is it the right syntax to use '~'?

 

N



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

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20091015/9e8bc123/attachment.html 


More information about the antlr-interest mailing list