1

我认为 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}"被正确标记。谁能帮我解决这个问题?

谢谢!

4

3 回答 3

1

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

那么为什么要使用三个句点而不是两个句点,语言必须对“范围”使用两个句点,并且语言应该根据以下“字符”确定句点是浮点数还是范围的一部分。

您可能需要查看 Defiitive ANTLR Reference,了解如何为不同的规则构建谓词。

希望这可以帮助您找到完成任务的正确方法。

于 2010-04-20T23:37:20.460 回答
1

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

语言禁止这种格式的浮点数并要求小数点左侧至少有一个数字(即使它是 0)是很常见的。我相信改变你的语法会解决你的问题。

可能有一种方法可以用谓词来修复它,但我还没有花足够的时间使用 ANTLR 来看到一个明显的方法来做到这一点。

于 2010-04-25T17:19:11.400 回答
0

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

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

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

于 2010-04-20T22:32:29.503 回答