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

@init {

  int count = 0;

}

: privelement { count++; }

| ^(DOT privs privs)

;



privelement

: MULT

| IDENTIFIER

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

;





*From:* antlr-dev-boun...@antlr.org [mailto:antlr-dev-boun...@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

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.



Mike
-- 
www.soft-gems.net
_______________________________________________
antlr-dev mailing list
antlr-dev@antlr.org
http://www.antlr.org/mailman/listinfo/antlr-dev

Reply via email to