ANTLR lexing путается с '' и плавает

Я думаю, что лексер ANTLR рассматривает мою попытку выражения диапазона "1...3" как число с плавающей запятой. Выражение "x={1...3}" выходит из лексера как "x={.3}", когда я использовал следующие определения токенов:

FLOAT
    :   ('0'..'9')+   ('.' '0'..'9'+)? EXPONENT?
    |   ('.' '0'..'9')+ EXPONENT?
    ;

AUTO : '...';

Когда я меняю FLOAT, чтобы просто проверять целые числа, вот так:

FLOAT   :    ('0'..'9')+;

то выражение "x={1...3}" токенизировано правильно. Может ли кто-нибудь помочь мне исправить это?

Спасибо!


person Andy Hull    schedule 20.04.2010    source источник
comment
Является выражением x={1..3} или x={1...3}. У вас написано в обе стороны.   -  person Sam Harwell    schedule 20.04.2010
comment
Выражение x={1...3}, просто опечатка.   -  person Andy Hull    schedule 20.04.2010


Ответы (3)


Я думаю, что лексер помещает ваш первый период в токен FLOAT, а затем оставшиеся два периода не делают ваш токен AUTO. Вам понадобится предикат, чтобы определить, должен ли период быть частью плавающего или автоматического токена.

Итак, почему вы используете три точки вместо двух, должны ли языки использовать две точки для «диапазона», и язык должен определять, является ли точка частью числа с плавающей запятой или диапазона на основе следующего «символа».

Вам, вероятно, нужно изучить Defiitive ANTLR Reference, чтобы узнать, как создать свой предикат для различных правил.

Надеюсь, это поможет вам найти правильный способ выполнить задание.

person WayneH    schedule 20.04.2010

WayneH решает вашу проблему. Вы разрешили использовать числа с плавающей запятой в формате ".3" (без ведущего 0). Итак, лексер идентифицирует последний . и 3 и считает его числом с плавающей запятой. В результате он не видит три точки. Он видит две точки и поплавок.

Языки очень часто запрещают этот формат для чисел с плавающей запятой и требуют, чтобы слева от десятичной дроби была хотя бы одна цифра (даже если это 0). Я считаю, что изменение вашей грамматики решит вашу проблему.

Вероятно, есть способ исправить это с помощью предиката, но я еще не провел достаточно времени с ANTLR, чтобы увидеть очевидный способ сделать это.

person Mike Cargal    schedule 25.04.2010

Для тех, кто хочет сделать это...

http://www.antlr.org/wiki/display/ANTLR3/Lexer+grammar+for+floating+point%2C+dot%2C+range%2C+time+specs

Я могу просто изменить синтаксис языка, заменив "..." ключевым словом "to".

person Andy Hull    schedule 20.04.2010