我正在使用ANTLR創建一個深奧的語言只是爲了好玩。我想要的語法只使用單詞和字符,所以沒有分號或圓括號等。質量映射詞法規則
事情是,我不想要數字。例如,我希望編碼人員輸入twenty-four
而不是24
。
ANTLR有支持嗎?我意識到我可以做類似的事情:
ONE = '1' ;
TWO = '2' ;
...
twenty-four = TWO FOUR;
等等。
由於數字是無限的(有點),這會變得乏味。有沒有更好的方法可以在ANTLR中處理?
我正在使用ANTLR創建一個深奧的語言只是爲了好玩。我想要的語法只使用單詞和字符,所以沒有分號或圓括號等。質量映射詞法規則
事情是,我不想要數字。例如,我希望編碼人員輸入twenty-four
而不是24
。
ANTLR有支持嗎?我意識到我可以做類似的事情:
ONE = '1' ;
TWO = '2' ;
...
twenty-four = TWO FOUR;
等等。
由於數字是無限的(有點),這會變得乏味。有沒有更好的方法可以在ANTLR中處理?
如果你不想寫任何數字,你必須編寫一個涵蓋所有數字的詞法分析規則,並且在稍後的評估中(在聆聽者或訪問者中)報告這是一個錯誤。 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
*數量是無限的(在某種程度上)*與其說實際上,一旦你列出的所有的數字的名字,10個來自倍數的名字*二十*到*九十*,加*百*,*千*,*百萬*和*十億*你有從單詞到數字的基本翻譯。現在你所需要的只是編寫英語表達的語法,如*一億三千五百二千四百零七十九*。肯定ANTLR非常適合。 –