Лексинг ANTLR запутывается из-за '...' и плавает - PullRequest
1 голос
/ 20 апреля 2010

Я думаю, что лексер 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}" правильно маркируется. Может кто-нибудь помочь мне это исправить?

Спасибо!

Ответы [ 3 ]

1 голос
/ 21 апреля 2010

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

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

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

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

1 голос
/ 25 апреля 2010

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

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

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

0 голосов
/ 21 апреля 2010

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

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

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

...