2017-02-10 56 views
0

我正在使用ANTLR创建一个深奥的语言只是为了好玩。我想要的语法只使用单词和字符,所以没有分号或圆括号等。质量映射词法规则

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

ANTLR有支持吗?我意识到我可以做类似的事情:

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

等等。

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

+2

*数量是无限的(在某种程度上)*与其说实际上,一旦你列出的所有的数字的名字,10个来自倍数的名字*二十*到*九十*,加*百*,*千*,*百万*和*十亿*你有从单词到数字的基本翻译。现在你所需要的只是编写英语表达的语法,如*一亿三千五百二千四百零七十九*。肯定ANTLR非常适合。 –

回答

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