批量映射词法规则

时间:2017-02-10 13:22:42

标签: java parsing antlr antlr4

我正在使用ANTLR创建一种深奥的语言,只是为了好玩。我希望语法只使用单词和字符,所以没有分号或括号等。

事情是,我也不想要数字。例如,我希望编码器输入twenty-four而不是24

ANTLR是否支持此功能?我意识到我可以做一些像:

ONE = '1' ;
TWO = '2' ;
...
twenty-four = TWO FOUR;

等等。

由于数字是无限的(有点),这将变得有点单调乏味。有没有更好的方法可以在ANTLR中处理这个问题?

1 个答案:

答案 0 :(得分:0)

如果您不想写任何数字,则必须编写涵盖所有数字的词法分析器规则,并在稍后的评估中(在听众或访问者中)将此报告为错误。 Lexer的规则就是这样的 ACTUAL_NUMBERS :[0-9]+;

其次,您必须编写代表“措辞”数字的所有词法规则。因此,您必须将@High Performance Mark在评论中写入的所有数字写入您的问题(我将引用once you've listed the names of all the digits, the names of the multiples of 10 from twenty to ninety, added in hundred, thousand, million and billion),加上数字10,11和12.这样,使用解析器规则,您将拥有所有(几乎所有)数字。

语法会是这样的:

//same for billion, million
...
triples : (singles)? HUNDRED (for_singles)
for_triples : singles | TEN | doubles;
doubles: ELEVEN | TWELVE | (singles TEEN) 
    |  (TWENTY singles) |
    ...
    | (NINETY singles);
singles: ONE | TWO | ... | NINE;


ONE : 'one' | 'ONE';
//until 9
TEN : 'ten' | 'TEN';
//11, 12
TEEN : 'teen' | 'TEEN';
TWENTY : 'twenty' | 'TWENTY' ;
//until ninety
HUNDRED: 'hundred' | 'HUNDRED';
THOUSAND: 'THOUSAND' | 'thousand';
//million, billion