ANTLR lexing对'...'和浮动感到困惑

时间:2010-04-20 19:13:38

标签: antlr antlr3

我认为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 个答案:

答案 0 :(得分:1)

我认为词法分析器将您的第一个句点放入FLOAT令牌中,然后剩余的两个句点不会生成您的AUTO令牌。您将需要一个谓词来确定该句点是否应该是浮动或自动令牌的一部分。

那么为什么你使用三个句号而不是两个句号,语言必须使用两个句号作为“范围”,语言应该确定句点是浮点数的一部分还是基于以下“字符”的范围。

您可能需要查看有关如何为不同规则构建谓词的Defiitive ANTLR参考。

希望这有助于您找到完成任务的正确方法。

答案 1 :(得分:1)

WayneH遇到了你的问题。你已经允许格式为“.3”的浮点数(没有前导0)。因此,词法分析器识别最后一个。和3并认为它是一个浮点数。结果它没有看到三个点。它看到两个点和一个浮点数。

语言通常不允许这种格式用于浮点数并且要求小数点左边至少有一个数字(即使它是0)。我相信改变你的语法会解决你的问题。

可能有一种方法可以用谓词修复它,但我还没有花足够的时间在ANTLR上看到一种明显的方法。

答案 2 :(得分:0)

对于任何想要这样做的人......

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

我可以更改语言语法,将“...”替换为“to”关键字。