我正在學習ANTLR。比方說,我有一個VHDL代碼,並希望對PROCESS塊做一些處理。其餘的應該完全忽略。我不想描述整個VHDL語言,因爲我只對流程塊感興趣。所以我可以編寫一個匹配進程塊的規則。但是,如何告訴ANTLR僅匹配進程阻止規則並忽略其他任何內容?ANTLR:消除混亂
1
A
回答
3
我知道旁邊沒有VHDL,讓我們說你要更換所有單行註釋與多線(Java)的源文件註釋:
//foo
應該變成:
/* foo */
當然,您需要讓詞法分析器匹配單行註釋。但是,你也應該確保它承認多行註釋,因爲你不希望//bar
被確認爲單行註釋信息:
/*
//bar
*/
這同樣適用於字符串字面量:
String s = "no // comment";
最後,你應該在詞法分析器中創建一些可以匹配任何字符的全部規則。
一個快速演示:
grammar T;
parse
: (t=. {System.out.print($t.text);})* EOF
;
Str
: '"' ('\\' . | ~('\\' | '"'))* '"'
;
MLComment
: '/*' .* '*/'
;
SLComment
: '//' ~('\r' | '\n')*
{
setText("/* " + getText().substring(2) + " */");
}
;
Any
: . // fall through rule, matches any character
;
如果你現在解析輸入這樣的:
//comment 1
class Foo {
//comment 2
/*
* not // a comment
*/
String s = "not // a // comment"; //comment 3
}
以下將被打印到控制檯:
/* comment 1 */
class Foo {
/* comment 2 */
/*
* not // a comment
*/
String s = "not // a // comment"; /* comment 3 */
}
注意,這是隻是一個快速演示:在Java中的字符串文字可能包含Unicode轉義,我的演示不支持,以及我的演示也不處理字符文字(字符文字char c = '"';
會打破它)。當然,所有這些事情都很容易解決。
2
在即將到來的ANTLR v4中,您可以進行模糊解析。看看
http://www.antlr.org/wiki/display/ANTLR4/Wildcard+Operator+and+Nongreedy+Subrules
你可以在這裏測試版軟件:
http://antlr.org/download/antlr-4.0b3-complete.jar
特倫斯
+0
謝謝! ANTLR真的是一項偉大的工作!你的書也很棒! – Andy
相關問題
- 1. 撤消一堆Git混亂
- 2. 混亂
- 3. 混亂
- 4. 混亂
- 5. 混亂
- 6. 如何重構Rails控制器操作以消除混亂?
- 7. AndEngine混亂的取消註冊IUpdateHandler
- 8. 混亂取消縮進錯誤
- 9. BST節點刪除混亂[JaVa]
- 10. Coredata刪除規則混亂,Xcode中
- 11. git的重命名/刪除混亂
- 12. 先行混亂
- 13. pySpark toRowMatrix混亂
- 14. PrintWriter的混亂
- 15. CreateMutex混亂
- 16. Android混亂
- 17. ado.net SQLite混亂
- 18. 的RewriteCond混亂
- 19. CFG OPLIST混亂
- 20. Android inApp混亂
- 21. convertToNodeSpace混亂
- 22. SML型混亂
- 23. 的memcpy混亂
- 24. Bitmap.Lockbits混亂
- 25. EDK SDK混亂
- 26. 類圖混亂
- 27. 語法混亂
- 28. 打印混亂
- 29. Calendar類混亂
- 30. 混亂從fluffycat
不客氣@Andy。 –
Thanks @Bart。我想知道是否有可能使用符合「任何」規則的ANTLR數據進行捕獲?比如說,我想要捕捉兩個SLComment令牌之間的所有文本,怎麼可能? – user1552175