[antlr-interest] nondeterminism question

Klaas Hofstra antlr at klaashofstra.com
Thu Sep 1 09:08:12 PDT 2005


Shmuel,

Thanks for your reply!

>I am guessing at the structure of expression
I added the complete expression grammar below.
>[..] but it seems to me that  
>range, and therefore the line in question, can't distinguish between a 
>grouped expression and a bitSpliceExpression. Does changing k, the 
>lookahead, value help.

When you say 'grouped expression', do you mean 'LPAREN expression RPAREN' ?

Because bitSliceExpression can only follow a 'primaryExpression' or 'LPAREN 
expression RPAREN!' I thought it could be distinguised from a grouped 
expression. Am I missing something?

I changed k to 3. This resulted in the following warning at the same line as 
before:

warning:nondeterminism between alts 1 and 2 of block upon
  k==1:LPAREN
  k==2:ID,LPAREN,INT,REAL,PLUS,MINUS,"not","cast"
  k==3:ID,LT,GT,LPAREN,LBRACKET,INT,REAL,"signed","unsigned","float",
            "integer","enum",DOTDOT,"and","or","nand","nor","xor","xnor",
            EQUALS,NOT_EQUALS,GTE,LTE,"sll","srl","sla","sra","rol","ror",
            PLUS,MINUS,TIMES,DIV,"mod","not","cast"

Looking at the above warning, I guess there is a problem with the expressions 
in 'range' but I don't get why.

Anyone?

TIA,

Klaas
-----------------------------------

typeDef
    : "signed"
    | "unsigned"
    | "float"
    | ("integer" ( LPAREN! range RPAREN! )? )      <= warning on this line
    ;

range 
    : expression DOTDOT! expression
    ;

expression
    : logicalExpression
    ;

logicalExpression
    : relationalExpression ((AND^ | OR^ | NAND^ | NOR^ | XOR^ | XNOR^) 
relationalExpression)*
    ;

relationalExpression
    : shiftExpression ((EQUALS^ | NOT_EQUALS^ | GT^ | GTE^ | LT^ | LTE^) 
shiftExpression)*
    ;

shiftExpression
    : addExpression ((SLL^ | SRL^ | SLA^ | SRA^ | ROL^ | ROR^) addExpression)*
    ;

addExpression
    : mulExpression ((PLUS^ | MINUS^) mulExpression)*
    ;

mulExpression
    : unaryExpression ((TIMES^ | DIV^ | MOD^) unaryExpression)*
    ;

unaryExpression
    : postFixExpression
    | PLUS^ unaryExpression
    | MINUS^ unaryExpression
    | NOT^ unaryExpression
    | "cast"! (typeSpec | ID) unaryExpression
    ;

postFixExpression
    : (primaryExpression | (LPAREN! expression RPAREN!)) (
      (bitIndexExpression) => bitIndexExpression
    | bitSliceExpression 
    | arrayIndexExpression
     )?
    ;

arrayIndexExpression
    : LBRACKET! logicalExpression RBRACKET!
    ;

bitIndexExpression
    : LPAREN! logicalExpression RPAREN!
    ;

bitSliceExpression
    : LPAREN! logicalExpression DOTDOT! logicalExpression RPAREN!
    ;

primaryExpression
    : ID | INT | REAL 
    ;

-----------------------------------


More information about the antlr-interest mailing list