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:
Ist dies nicht auch so bei YACC, dass Regeln entsprechend ihres Auftretens geprüft werden ?
Grüße Bitti
Möglich, aber YACC ist so undurchsichtig. :)
Naja, ich wollte mich auch mal mit solchen Dingen auseinander setzen, hatte aber in der jüngeren Vergangenheit kaum Zeit für diese Dinge.
Post a Comment