[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