[antlr-interest] Using JFlex with Antlr
Terence Parr
parrt at cs.usfca.edu
Thu Oct 4 13:50:59 PDT 2007
Sounds like a good FAQ entry. Can you add to wiki?
Thanks,
Ter
On Oct 4, 2007, at 11:41 AM, FranklinChen at cmu.edu wrote:
>> Now, I am still interested in how to couple JFlex with ANTLR. Anyone
>> who can share information about this?
>>
>> -Andreas
>
> I am a happy user of JFlex with ANTLR 3. What you need to do is to
> make the interface of the JFlex-generated scanner compatible with what
> ANTLR expects. Here is how I do it in a file MyLexer.flex:
>
> import org.antlr.runtime.*;
>
> // To get ANTLR token types generated for parser.
> import static mypackage.MyParser.*;
>
> %%
>
> %public
> %class MyLexer
> %implements TokenSource
> %type Token
> %unicode
> %line
> %column
>
> %{
> public Token nextToken() {
> try {
> return yylex();
> }
> catch (java.io.IOException e) {
> System.err.println("shouldn't happen: " + e.getMessage());
> return Token.EOF_TOKEN;
> }
> }
>
> /** Turn 1-based to 0-based. */
> public void setLine(int line) {
> this.yyline = line-1;
> }
>
> public void setColumn(int column) {
> this.yycolumn = column;
> }
>
> public int getLine() {
> return this.yyline+1;
> }
>
> public int getColumn() {
> return this.yycolumn;
> }
>
> private Token newToken(int type, String text) {
> CommonToken token = new CommonToken(type, text);
> token.setLine(getLine());
> token.setCharPositionInLine(getColumn());
> return token;
> }
>
> private Token newToken(int type) {
> CommonToken token = new CommonToken(type, yytext());
> token.setLine(getLine());
> token.setCharPositionInLine(getColumn());
> return token;
> }
> %}
>
> %%
>
> // ...actions... use newToken to return token
>
> <<EOF>> { return newToken(EOF); }
>
>
> Then in the driver in Java, just do the following:
>
> MyLexer lexer = new MyLexer(reader);
> CommonTokenStream tokenStream = new CommonTokenStream(lexer);
> MyParser parser = new MyParser(tokenStream);
>
> --
> Franklin
More information about the antlr-interest
mailing list