2017-04-02 25 views
0

在ANTLR 4.6和更早下面的代碼工作正常:的正確實施和使用自定義字符與ANTLR流> = 4.7

String code = readFile(args[0]); 
ANTLRCustomStream codeStream = new ANTLRCustomStream(code); 
MyLexer lexer = new MyLexer(codeStream); 

我使用CaseInsensitiveInputStream.java對焦炭的情況下通過的ANTLRCustomStream方式忽略。

但是,如何在版本4.7和更高版本的ANTLR中使用不區分大小寫的輸入流? ANTLRInputStream已被棄用,我不想使用它。

CharStream codeStream = CharStreams.fromFileName(args[0]); 
// customCharStream here 
MyLexer lexer = new MyLexer(customCharStream); 

回答

0

不幸的是,CharStreams接口不允許使用自定義流。您必須像以前一樣創建自定義流(通過new CaseInsensitiveInputStream(...))。 CharStreams接口只有有限的用途(爲標準情況創建優化流)。

Btw。我寧願推薦使用典型的A: [aA]; B: [bB]; ..方法來實現不區分大小寫。這種降低價格的技巧只是一種對全部Unicode輸入不起作用的破解(例如,某些uppercass字母可能有多個小寫字母變體)。然而,Uppercasing在這裏也沒有幫助(例如,在德國大寫的Straße變成STRASSE)。

總的來說這是非常棘手的實施真正區分大小寫解析爲完整的Unicode輸入,因爲它需要區分摺疊輸入和語法標記,以便能夠對它們進行比較。

+0

由於以下原因,不區分大小寫的片段不合適: 1.它們比普通標記(abc:'abc')慢,請參閱@ jim-idle [忽略大小寫新語法問題的評論](https: //github.com/antlr/antlr4/issues/1002#issuecomment-141955368)。 2.在大多數情況下的「大街」改造將不會因爲有問題「的消息和其他'的getText()'方法從原始輸入字符串返回數據」(見@ SAM-哈韋爾[這裏評論](HTTPS ://gist.github.com/sharwell/9424666#gistcomment-1186748))。而「Straße」不能是關鍵字(通常這是一個字符串文字)。 –

+0

你似乎對不區分大小寫的問題已經:-)工作了相當長的一段時間'Straße'例如:我想做的與顯示是由於較低的焦炭數量的變化或上蓋的問題,這使得不區分大小寫由較低的套管比較如此不可靠。這可能適用於ANSI輸入,但不是完整的Unicode。您真正需要的是在這裏進行案例摺疊(以及在我們使用時進行規範化)。 –