Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Here

...

is

...

a

...

rule

...

to

...

match

...

floats:

...

}
Code Block
NUM_FLOAT
    :     DIGITS '.' (DIGITS)? (EXPONENT_PART)? (FLOAT_TYPE_SUFFIX)?
    | '.' DIGITS (EXPONENT_PART)? (FLOAT_TYPE_SUFFIX)?
    |     DIGITS EXPONENT_PART FLOAT_TYPE_SUFFIX
    |     DIGITS EXPONENT_PART
    |     DIGITS FLOAT_TYPE_SUFFIX
    ;
{code}

Now

...

if

...

you

...

want

...

to

...

add

...

'..'

...

range

...

operator

...

so

...

1..10

...

makes

...

sense,

...

ANTLR

...

has

...

trouble

...

distinguishing

...

1.

...

(start

...

of

...

the

...

range)

...

from

...

1.

...

the

...

float

...

without

...

backtracking.

...

So,

...

match

...

'1..'

...

in

...

NUM_FLOAT

...

and

...

just

...

emit

...

two

...

non-float

...

tokens:

...

}
Code Block
NUM_FLOAT
    :     d=DIGITS r='..'
    	  {
    	  $d.setType(NUM_INT);
    	  emit($d);
          $r.setType(RANGE);
    	  emit($r);
    	  }
    |	  DIGITS '.' (DIGITS)? (EXPONENT_PART)? (FLOAT_TYPE_SUFFIX)?
    | '.' DIGITS (EXPONENT_PART)? (FLOAT_TYPE_SUFFIX)?
    |     DIGITS EXPONENT_PART FLOAT_TYPE_SUFFIX
    |     DIGITS EXPONENT_PART
    |     DIGITS FLOAT_TYPE_SUFFIX
    ;
{code}

By

...

default

...

Lexer

...

objects

...

only

...

emit

...

1

...

token

...

at

...

once.

...

Make

...

a

...

buffer

...

by

...

overriding

...

a

...

few

...

methods:

...

}
Code Block
@lexer::members {
List tokens = new ArrayList();
public void emit(Token token) {
        state.token = token;
    	tokens.add(token);
       
System.out.println("emit "+token);
}
public Token nextToken() {
    	super.nextToken();
        if ( tokens.size()==0 ) {
            return Token.EOF_TOKEN;
        }
        return (Token)tokens.remove(0);
}
}
{code}