[antlr-interest] Rule precedence works differently when using a predicate?

Bart Kiers bkiers at gmail.com
Mon Oct 24 02:46:04 PDT 2011


Hi all,

As I understand it, ANTLR's lexer matches rules from top to bottom in the .g
grammar file and when two rules match the same number of characters, the one
that is defined first has precedence over the later one(s).

However, take the following grammar:

grammar T;

@lexer::members {
  private boolean test() {
    return true;
  }
}

parse
  :  (t=. {System.out.println(tokenNames[$t.type] + " :: " +  $t.text);})*
EOF
  ;

KEY
  :  'key'
  ;

ANY
  :  ({test()}?=> . )+
  ;


And the test class:"

import org.antlr.runtime.*;


public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(new ANTLRStringStream("key"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    parser.parse();
  }
}


I'd expected "KEY :: key" to be printed to the console, however, "ANY :: key"
is printed instead. So the last rule is matched, while the KEY rule also
matches the same input and is defined before ANY. Why?

Kind regards,

Bart.


More information about the antlr-interest mailing list