Last.FM: Recently listened

Monday, August 27, 2007

Lexer rules need ordering...

I was trying to parse lines like

import <foo/bar.h>

using ANTLR, when I found out that ANTLR's lexer rules have a precedence: rules are tried in the order they appear in the .g file. In my case, I had a rule matching a keyword such as "import" and a rule matching anything that is a word. Playing around with rules and their order, I found that my grammar works, if I write the keyword rule before the word rule, otherwise I get a "rule not reachable"-error.

This is how you get the file name out of the line above:

fragment DIGIT : '0'..'9';
fragment CHAR : 'a'..'z' | 'A'..'Z';

IMPORT : 'import' ;
GT : '>' ;
LT : '<' ;
WORD : CHAR (CHAR|DIGIT)*;
WS : (' '|'\t'|'\n'|'\r')+ { self.skip(); } ;

filename : WORD ('/' WORD)* '.' WORD ;

import_r : IMPORT LT f=filename GT {print $f.text};


3 comments:

Bittis Blog said...

Ist dies nicht auch so bei YACC, dass Regeln entsprechend ihres Auftretens geprüft werden ?

Grüße Bitti

Bjoern said...

Möglich, aber YACC ist so undurchsichtig. :)

Bittis Blog said...

Naja, ich wollte mich auch mal mit solchen Dingen auseinander setzen, hatte aber in der jüngeren Vergangenheit kaum Zeit für diese Dinge.