Roman Zabicki
Roman Zabicki

Reputation: 214

unable to parse ints with antlr

I'm trying to parse ints, but I can parse only multi-digit ints, not single-digit ints.

I narrowed it down to a very small lexer and parser which I based on sample grammars from antlr.org as follows:

# IntLexerTest.g4
lexer grammar IntLexerTest;

DIGIT
    : '0' .. '9'
    ;

INT
   : DIGIT+
   ;


#IntParserTest.g4
parser grammar IntParserTest;
options {
    tokenVocab = IntLexerTest;
}

mything
    : INT
    ;

And when I try to parse the digit 3 all by itself, I get "line 1:0 mismatched input '3' expecting INT". On the other hand, if I try to parse 33, it's fine. What am I doing wrong?

Upvotes: 1

Views: 108

Answers (1)

Bart Kiers
Bart Kiers

Reputation: 170227

The lexer matches rules from top to bottom. When 2 (or more) rules match the same amount of characters, the rule defined first will win. That is why a single digit is matched as an DIGIT and two or more digits as an INT.

What you should do is make DIGIT a fragment. Fragments are only used by other lexer rules and will never become a token of their own:

fragment DIGIT
 : '0' .. '9'
 ;

INT
 : DIGIT+
 ;

Upvotes: 2

Related Questions