[antlr-interest] Re: ANTLR and runtime token assigning - URGENT

antlrlist antlrlist at yahoo.com
Fri Jun 20 07:02:22 PDT 2003


> 1. How can I set "SEPARATOR" token value from my grammar file in
produced CSVLexer/CSVParser?
> I mean, I wrote class that uses this Parser/Lexer but I want the
class' user to have ability to set SEPARATOR to ';'
> instead of ",". How is it possible to define variable SEPARATOR in
Parser/Lexer that will be used to process input
> without running antlr.Tool again?

The only way I could think about is accepting both "," and ";", like this:

SEPARATOR : ';' | ',';

Now the lexer recognizes both entries like SEPARATOR at the same time.
If you don't want to recognize them simultaneously use a class member:

class CSVLexer extends Lexer;
...
{
   protected char sepChar = ',';
   ... // your gets and sets here
}

SEPARATOR : { sepChar==',' }? ','
          | { sepChar==';' }? ';'
          ;

> I wonder why ANTLR hard-code tokens instead of exposing them in
easy-to-modify variables...

I had the same thoughts until I begun to understand the code that
ANTLR generates, and how it is generated. The idea is that you can't
generate all those "switchs" if you don't have fixed values...

> 2. In my grammar I tried to put
> RECORD  : (~('"'|SEPARATOR|'\r'|'\n'))+;
> instead of
> RECORD  : (~('"'|','|'\r'|'\n'))+;
> 
> but antlr.Tool throws error:
> csv.g:119:13: This subrule cannot be inverted.  Only subrules of the
form:
>      (T1|T2|T3...) or
>      ('c1'|'c2'|'c3'...)
>  may be inverted (ranges are also allowed).
>  Exiting due to errors.
> 
> How can I do that?
> 

If you're going to have ';' or ',' as SEPARATORS, then write:

RECORD  : (~('"'|','|';'|'\r'|'\n'))+;

Sorry, but you just can't have such a "customizable separator
character". You have to specify the character set you're going to use
on each rule; if not, then ANTLR just won't be able to generate the
right code. The analizer's code is based on the "constantness" of your
tokens.

If you want to have such a customizable analizer, you'll have to
create it manually; A lexer class only needs to implement the
TokenStream interface.

Cheers!


Enrique


 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 




More information about the antlr-interest mailing list