Mike Lischke | 19 Apr 2012 14:59
Picon
Favicon

Bug in C target generation

Jim,

with a rule like this:

privilege_level
:
(
first=MULT
 | first=MULT DOT second=MULT
 | first=IDENTIFIER DOT second=MULT
 | first=IDENTIFIER DOT second=IDENTIFIER
 | first=IDENTIFIER
) -> ^( PRIVILEGE_LEVEL $first $second? )
;

ANTLR generates this code:

pANTLR3_COMMON_TOKEN    ;
pANTLR3_COMMON_TOKEN    ;

      = NULL;
      = NULL;

which obviously does not compile. Is this a known problem? Any workaround possible?


<div>Jim,<div><br></div>
<div>with a rule like this:</div>
<div><br></div>
<div>
<div>privilege_level</div>
<div>
<span class="Apple-tab-span">	</span>:<span class="Apple-tab-span">	</span>
</div>
<div>
<span class="Apple-tab-span">	</span>(</div>
<div>
<span class="Apple-tab-span">	</span>first=MULT</div>
<div>
<span class="Apple-tab-span">	</span> &nbsp;| first=MULT DOT second=MULT</div>
<div>
<span class="Apple-tab-span">	</span> &nbsp;| first=IDENTIFIER DOT second=MULT</div>
<div>
<span class="Apple-tab-span">	</span> &nbsp;| first=IDENTIFIER DOT second=IDENTIFIER</div>
<div>
<span class="Apple-tab-span">	</span> &nbsp;| first=IDENTIFIER</div>
<div>
<span class="Apple-tab-span">	</span>)<span class="Apple-tab-span">	</span>-&gt; ^( PRIVILEGE_LEVEL $first $second? )</div>
<div>
<span class="Apple-tab-span">	</span>;</div>
<div><br></div>
<div>ANTLR generates this code:</div>
<div><br></div>
<div>
<div>
<span><span class="Apple-tab-span">	</span></span>pANTLR3_COMMON_TOKEN<span>&nbsp; &nbsp; ;</span>
</div>
<div>
<span><span class="Apple-tab-span">	</span></span>pANTLR3_COMMON_TOKEN<span>&nbsp; &nbsp; ;</span>
</div>
<div><br></div>
<div>
<span class="Apple-tab-span">	</span> &nbsp; &nbsp; &nbsp; = NULL;</div>
<div>
<span class="Apple-tab-span">	</span> &nbsp; &nbsp; &nbsp; = NULL;</div>
</div>
<div><br></div>
<div>which obviously does not compile. Is this a known problem? Any workaround possible?</div>
<div><br></div>
<div apple-content-edited="true">
Mike<br>--&nbsp;<br><a href="http://www.soft-gems.net">www.soft-gems.net</a><br>
</div>

<br>
</div>
</div>
Jim Idle | 19 Apr 2012 18:47

Re: Bug in C target generation

It is a problem with the code generation templates for all the targets (well, Java and C at least), someone did post a fix for it on the list, but it has not been issued as any formal patch yet.

 

privilege_level

: privs -> ^(PRIVILEGE_LEVEL $privs)

;

privs

: (MULT|IDENTIFIER) (DOT^ (MULT|IDENTIFIER))?

;

 

Though in fact I would avoid the PRIVILEGE_LEVEL node altogether unless its absence causes ambiguity issues in the tree grammar.

 

Jim

 

From: antlr-dev-bounces <at> antlr.org [mailto:antlr-dev-bounces-ErkRXerACLvYtjvyW6yDsg@public.gmane.org] On Behalf Of Mike Lischke
Sent: Thursday, April 19, 2012 5:59 AM
To: ANTLR Mailing Mailing List
Subject: [antlr-dev] Bug in C target generation

 

Jim,

 

with a rule like this:

 

privilege_level

          :          

          (

          first=MULT

           | first=MULT DOT second=MULT

           | first=IDENTIFIER DOT second=MULT

           | first=IDENTIFIER DOT second=IDENTIFIER

           | first=IDENTIFIER

          )           -> ^( PRIVILEGE_LEVEL $first $second? )

          ;

 

ANTLR generates this code:

 

          pANTLR3_COMMON_TOKEN    ;

          pANTLR3_COMMON_TOKEN    ;

 

                = NULL;

                = NULL;

 

which obviously does not compile. Is this a known problem? Any workaround possible?

 

 

<div><div class="WordSection1">
<p class="MsoNormal"><span>It is a problem with the code generation templates for all the targets (well, Java and C at least), someone did post a fix for it on the list, but it has not been issued as any formal patch yet.</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>privilege_level</span></p>
<p class="MsoNormal"><span>: privs -&gt; ^(PRIVILEGE_LEVEL $privs)</span></p>
<p class="MsoNormal"><span>;</span></p>
<p class="MsoNormal"><span>privs</span></p>
<p class="MsoNormal"><span>: (MULT|IDENTIFIER) (DOT^ (MULT|IDENTIFIER))?</span></p>
<p class="MsoNormal"><span>;</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>Though in fact I would avoid the PRIVILEGE_LEVEL node altogether unless its absence causes ambiguity issues in the tree grammar.</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>Jim</span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span>&nbsp;</span></a></p>
<div>
<div><div><p class="MsoNormal"><span>From:</span><span> <a href="mailto:antlr-dev-bounces@...">antlr-dev-bounces <at> antlr.org</a> [mailto:<a href="mailto:antlr-dev-bounces@...">antlr-dev-bounces@...</a>] On Behalf Of Mike Lischke<br>Sent: Thursday, April 19, 2012 5:59 AM<br>To: ANTLR Mailing Mailing List<br>Subject: [antlr-dev] Bug in C target generation</span></p></div></div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Jim,</p>
<div><p class="MsoNormal">&nbsp;</p></div>
<div><p class="MsoNormal">with a rule like this:</p></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div>
<div><p class="MsoNormal">privilege_level</p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>:<span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(</p></div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>first=MULT</p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;| first=MULT DOT second=MULT</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;| first=IDENTIFIER DOT second=MULT</p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;| first=IDENTIFIER DOT second=IDENTIFIER</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;| first=IDENTIFIER</p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>)<span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-&gt; ^( PRIVILEGE_LEVEL $first $second? )</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>;</p></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div><p class="MsoNormal">ANTLR generates this code:</p></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div>
<div>
<p class="MsoNormal"><span class="apple-tab-span"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>pANTLR3_COMMON_TOKEN</span><span>&nbsp; &nbsp; ;</span><span></span></p>
</div>
<div>
<p class="MsoNormal"><span class="apple-tab-span"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>pANTLR3_COMMON_TOKEN</span><span>&nbsp; &nbsp; ;</span><span></span></p>
</div>
<div><p class="MsoNormal"><span>&nbsp;</span></p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&nbsp; &nbsp; &nbsp; = NULL;</span></p>
</div>
<div>
<p class="MsoNormal"><span class="apple-tab-span"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&nbsp; &nbsp; &nbsp; = NULL;</span></p>
</div>
</div>
<div><p class="MsoNormal"><span>&nbsp;</span></p></div>
<div>
<p class="MsoNormal"><span>which obviously does not compile. Is this a known problem? Any workaround possible?</span></p>
</div>
<div><p class="MsoNormal"><span>&nbsp;</span></p></div>
<div>
<p class="MsoNormal">Mike<br>--&nbsp;<br><a href="http://www.soft-gems.net">www.soft-gems.net</a></p>
</div>
<p class="MsoNormal">&nbsp;</p>
</div>
</div>
</div></div>
Mike Lischke | 20 Apr 2012 09:48
Picon
Favicon

Re: Bug in C target generation


Hey Jim,

It is a problem with the code generation templates for all the targets (well, Java and C at least), someone did post a fix for it on the list, but it has not been issued as any formal patch yet.

Definitely not for C# because this code was taken from a grammar that works well with C#.

 

privilege_level
: privs -> ^(PRIVILEGE_LEVEL $privs)
;
privs
: (MULT|IDENTIFIER) (DOT^ (MULT|IDENTIFIER))?
;

 

Though in fact I would avoid the PRIVILEGE_LEVEL node altogether unless its absence causes ambiguity issues in the tree grammar.

Hmm, in fact, what I want to achieve actually is a bit different. But I have some difficulties to formulate the grammar properly. These are the cases I want to handle:

id
id. (error: missing id or star)
id.*
id.id
id.id. (error: missing id or star)
id.id.*
id.id.id

I would be thankful for a hint to get my brain into the right direction. The best I could come up with is that I get a tree with an invalid node. Tho actually I would like the special node with the missing value (to ease their handling, e.g. for code completion). My current grammar is:

primary:
parExpression
| literal
| number
| { LA(2) != DOT }? identifier (INC | DEC)?
| identifier DOT qualified_field
;

number:
NUM
| HEX_NUM
| DIGITS
| DECIMAL_NUM
;

qualified_field:
MULT
| { LA(2) != DOT }? identifier
| identifier DOT qualified_field2
;

qualified_field2:
MULT
| { LA(2) != DOT }? identifier
;

Without the lookaheads the matching process stops for cases like "id." returning only the id without error.
<div>
<br><div>
<div>Hey Jim,</div>
<br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span"><div lang="EN-US" link="blue" vlink="purple"><div class="WordSection1"><div><span>It is a problem with the code generation templates for all the targets (well, Java and C at least), someone did post a fix for it on the list, but it has not been issued as any formal patch yet.</span></div></div></div></span></blockquote>
<div><br></div>Definitely not for C# because this code was taken from a grammar that works well with C#.</div>
<div>
<br><blockquote type="cite"><span class="Apple-style-span"><div lang="EN-US" link="blue" vlink="purple"><div class="WordSection1">
<p class="MsoNormal"><span>&nbsp;</span></p>
<div><span>privilege_level</span></div>
<div><span>: privs -&gt; ^(PRIVILEGE_LEVEL $privs)</span></div>
<div><span>;</span></div>
<div><span>privs</span></div>
<div><span>: (MULT|IDENTIFIER) (DOT^ (MULT|IDENTIFIER))?</span></div>
<div><span>;</span></div>
<p class="MsoNormal"><span>&nbsp;</span></p>
<div><span>Though in fact I would avoid the PRIVILEGE_LEVEL node altogether unless its absence causes ambiguity issues in the tree grammar.</span></div>
</div></div></span></blockquote>
<br>
</div>
<div>Hmm, in fact, what I want to achieve actually is a bit different. But I have some difficulties to formulate the grammar properly. These are the cases I want to handle:</div>
<div><br></div>
<div>id</div>
<div>id.<span class="Apple-tab-span">	</span>(error: missing id or star)</div>
<div>id.*</div>
<div>id.id</div>
<div>id.id.<span class="Apple-tab-span">	</span>(error: missing id or star)</div>
<div>id.id.*</div>
<div>id.id.id</div>
<div><br></div>
<div>I would be thankful for a hint to get my brain into the right direction.&nbsp;The best I could come up with is that I get a tree with an invalid node. Tho actually I would like the special node with the missing value (to ease their handling, e.g. for code completion). My current grammar is:</div>
<div><br></div>
<div>
<div>primary:</div>
<div>
<span class="Apple-tab-span">	</span>parExpression</div>
<div>
<span class="Apple-tab-span">	</span>| literal</div>
<div>
<span class="Apple-tab-span">	</span>| number</div>
<div>
<span class="Apple-tab-span">	</span>| { LA(2) != DOT }? identifier (INC | DEC)?</div>
<div>
<span class="Apple-tab-span">	</span>| identifier DOT qualified_field</div>
<div>;</div>
<div><br></div>
<div>number:</div>
<div>
<span class="Apple-tab-span">	</span>NUM</div>
<div>
<span class="Apple-tab-span">	</span>| HEX_NUM</div>
<div>
<span class="Apple-tab-span">	</span>| DIGITS</div>
<div>
<span class="Apple-tab-span">	</span>| DECIMAL_NUM</div>
<div>;</div>
<div><br></div>
<div>qualified_field:</div>
<div>
<span class="Apple-tab-span">	</span>MULT</div>
<div>
<span class="Apple-tab-span">	</span>| { LA(2) != DOT }? identifier</div>
<div>
<span class="Apple-tab-span">	</span>| identifier DOT qualified_field2</div>
<div>;</div>
<div><br></div>
<div>qualified_field2:</div>
<div>
<span class="Apple-tab-span">	</span>MULT</div>
<div>
<span class="Apple-tab-span">	</span>| { LA(2) != DOT }? identifier</div>
<div>;</div>
<div><br></div>
</div>Without the lookaheads the matching process stops for cases like "id." returning only the id without error.<div>
<br><div apple-content-edited="true">
Mike<br>--&nbsp;<br><a href="http://www.soft-gems.net">www.soft-gems.net</a><br>
</div>
<br>
</div>
</div>
Jim Idle | 20 Apr 2012 19:58

Re: Bug in C target generation

privs

: (MULT|IDENTIFIER) (DOT^ privelement)*

;

 

privelement

: MULT

| IDENTIFIER

| -> MISSING

;

 

In your tree walker, count the elements to verify them and issue an error for the MISSING node.

 

 

privs

<at> init {

  int count = 0;

}

: privelement { count++; }

| ^(DOT privs privs)

;

 

privelement

: MULT

| IDENTIFIER

| MISSING { error(“Cannot….etc”); }

;

 

 

From: antlr-dev-bounces-ErkRXerACLvYtjvyW6yDsg@public.gmane.org [mailto:antlr-dev-bounces <at> antlr.org] On Behalf Of Mike Lischke
Sent: Friday, April 20, 2012 12:49 AM
To: ANTLR Mailing Mailing List
Subject: Re: [antlr-dev] Bug in C target generation

 

 

Hey Jim,



It is a problem with the code generation templates for all the targets (well, Java and C at least), someone did post a fix for it on the list, but it has not been issued as any formal patch yet.

 

Definitely not for C# because this code was taken from a grammar that works well with C#.



 

privilege_level

: privs -> ^(PRIVILEGE_LEVEL $privs)

;

privs

: (MULT|IDENTIFIER) (DOT^ (MULT|IDENTIFIER))?

;

 

Though in fact I would avoid the PRIVILEGE_LEVEL node altogether unless its absence causes ambiguity issues in the tree grammar.

 

Hmm, in fact, what I want to achieve actually is a bit different. But I have some difficulties to formulate the grammar properly. These are the cases I want to handle:

 

id

id.      (error: missing id or star)

id.*

id.id.  (error: missing id or star)

id.id.*

 

I would be thankful for a hint to get my brain into the right direction. The best I could come up with is that I get a tree with an invalid node. Tho actually I would like the special node with the missing value (to ease their handling, e.g. for code completion). My current grammar is:

 

primary:

          parExpression

          | literal

          | number

          | { LA(2) != DOT }? identifier (INC | DEC)?

          | identifier DOT qualified_field

;

 

number:

          NUM

          | HEX_NUM

          | DIGITS

          | DECIMAL_NUM

;

 

qualified_field:

          MULT

          | { LA(2) != DOT }? identifier

          | identifier DOT qualified_field2

;

 

qualified_field2:

          MULT

          | { LA(2) != DOT }? identifier

;

 

Without the lookaheads the matching process stops for cases like "id." returning only the id without error.

 

 

<div><div class="WordSection1">
<p class="MsoNormal"><span>privs</span></p>
<p class="MsoNormal"><span>: (MULT|IDENTIFIER) (DOT^ privelement)*</span></p>
<p class="MsoNormal"><span>;</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>privelement</span></p>
<p class="MsoNormal"><span> : MULT</span></p>
<p class="MsoNormal"><span> | IDENTIFIER</span></p>
<p class="MsoNormal"><span> | -&gt; MISSING</span></p>
<p class="MsoNormal"><span>;</span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span>&nbsp;</span></a></p>
<p class="MsoNormal"><span>In your tree walker, count the elements to verify them and issue an error for the MISSING node.</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>privs</span></p>
<p class="MsoNormal"><span> <at> init {</span></p>
<p class="MsoNormal"><span>&nbsp; int count = 0;</span></p>
<p class="MsoNormal"><span>}</span></p>
<p class="MsoNormal"><span> : privelement { count++; }</span></p>
<p class="MsoNormal"><span> | ^(DOT privs privs)</span></p>
<p class="MsoNormal"><span>;</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>privelement</span></p>
<p class="MsoNormal"><span> : MULT</span></p>
<p class="MsoNormal"><span> | IDENTIFIER</span></p>
<p class="MsoNormal"><span> | MISSING { error(&ldquo;Cannot&hellip;.etc&rdquo;); }</span></p>
<p class="MsoNormal"><span>;</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<p class="MsoNormal"><span>&nbsp;</span></p>
<div>
<div><div>
<p class="MsoNormal"><span>From:</span><span> <a href="mailto:antlr-dev-bounces@...">antlr-dev-bounces@...</a> [mailto:<a href="mailto:antlr-dev-bounces@...">antlr-dev-bounces <at> antlr.org</a>] On Behalf Of Mike Lischke<br>Sent: Friday, April 20, 2012 12:49 AM<br>To: ANTLR Mailing Mailing List<br>Subject: Re: [antlr-dev] Bug in C target generation</span></p>
</div></div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<div>
<div><p class="MsoNormal">Hey Jim,</p></div>
<p class="MsoNormal"><br><br></p>
<div><div>
<p class="MsoNormal"><span>It is a problem with the code generation templates for all the targets (well, Java and C at least), someone did post a fix for it on the list, but it has not been issued as any formal patch yet.</span></p>
</div></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<p class="MsoNormal">Definitely not for C# because this code was taken from a grammar that works well with C#.</p>
</div>
<div>
<p class="MsoNormal"><br><br></p>
<div>
<p class="MsoNormal">
<span>&nbsp;</span></p>
<div>
<p class="MsoNormal"><span>privilege_level</span></p>
</div>
<div><p class="MsoNormal"><span>: privs -&gt; ^(PRIVILEGE_LEVEL $privs)</span></p></div>
<div>
<p class="MsoNormal"><span>;</span></p>
</div>
<div><p class="MsoNormal"><span>privs</span></p></div>
<div>
<p class="MsoNormal"><span>: (MULT|IDENTIFIER) (DOT^ (MULT|IDENTIFIER))?</span></p>
</div>
<div><p class="MsoNormal"><span>;</span></p></div>
<p class="MsoNormal"><span>&nbsp;</span></p>
<div>
<p class="MsoNormal"><span>Though in fact I would avoid the PRIVILEGE_LEVEL node altogether unless its absence causes ambiguity issues in the tree grammar.</span></p>
</div>
</div>
<p class="MsoNormal">&nbsp;</p>
</div>
<div>
<p class="MsoNormal">Hmm, in fact, what I want to achieve actually is a bit different. But I have some difficulties to formulate the grammar properly. These are the cases I want to handle:</p>
</div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div><p class="MsoNormal">id</p></div>
<div><p class="MsoNormal">id.<span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(error: missing id or star)</p></div>
<div>
<p class="MsoNormal">id.*</p>
</div>
<div><p class="MsoNormal"><a href="http://id.id">id.id</a></p></div>
<div><p class="MsoNormal"><a href="http://id.id">id.id</a>.<span class="apple-tab-span">&nbsp; </span>(error: missing id or star)</p></div>
<div><p class="MsoNormal">
id.id.*</p></div>
<div><p class="MsoNormal"><a href="http://id.id.id">id.id.id</a></p></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div>
<p class="MsoNormal">I would be thankful for a hint to get my brain into the right direction.&nbsp;The best I could come up with is that I get a tree with an invalid node. Tho actually I would like the special node with the missing value (to ease their handling, e.g. for code completion). My current grammar is:</p>
</div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div>
<div><p class="MsoNormal">primary:</p></div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>parExpression</p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| literal</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| number</p></div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| { LA(2) != DOT }? identifier (INC | DEC)?</p></div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| identifier DOT qualified_field</p></div>
<div><p class="MsoNormal">;</p></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div>
<p class="MsoNormal">number:</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>NUM</p></div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| HEX_NUM</p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| DIGITS</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| DECIMAL_NUM</p></div>
<div><p class="MsoNormal">;</p></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div>
<p class="MsoNormal">qualified_field:</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MULT</p></div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| { LA(2) != DOT }? identifier</p></div>
<div><p class="MsoNormal">
<span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| identifier DOT qualified_field2</p></div>
<div><p class="MsoNormal">;</p></div>
<div><p class="MsoNormal">&nbsp;</p></div>
<div><p class="MsoNormal">qualified_field2:</p></div>
<div>
<p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MULT</p>
</div>
<div><p class="MsoNormal"><span class="apple-tab-span">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| { LA(2) != DOT }? identifier</p></div>
<div>
<p class="MsoNormal">;</p>
</div>
<div><p class="MsoNormal">&nbsp;</p></div>
</div>
<p class="MsoNormal">Without the lookaheads the matching process stops for cases like "id." returning only the id without error.</p>
<div>
<p class="MsoNormal">&nbsp;</p>
<div><p class="MsoNormal">Mike<br>--&nbsp;<br><a href="http://www.soft-gems.net">www.soft-gems.net</a></p></div>
<p class="MsoNormal">&nbsp;</p>
</div>
</div>
</div></div>

Gmane