2010-03-16 31 views
4

我需要分析一個簡單的DSL看起來像這樣:什麼時候最好使用解析器(如ANTLR)與編寫自己的解析代碼?

funcA Type1 a (funcB Type1 b) ReturnType c 

正如我與語法分析工具的經驗,我認爲這將是更快地編寫一個基本的解析器我自己(在Java中)。

它會更好,即使是簡單的DSL,對我來說,使用這樣的ANTLR,構建一個適當的語法定義是什麼?

+0

是'funcA Type1 a(funcB Type1 b)ReturnType c'你會解析嗎?或者你的語言是否也支持像「2-5 * 4」這樣的表達式?那麼像'Type x = y'這樣的任務呢?總之:在有人能夠正確回答你的問題之前,需要更多關於你的語言的細節。 – 2010-03-16 17:12:28

+0

所有語言支持都是通過嵌套函數調用對預定義變量進行操作的預定義函數。有效的,只是代碼類似於上述。沒有任務或符號運算符,比如'3 * 2'。 – 2010-03-16 17:24:14

回答

3

答案很簡單:當它更容易編寫描述你的語法比寫一個接受你的語法描述語言代碼的規則。

如果您需要解析的唯一的事情看上去完全像你上面寫的是什麼,那麼我會說你可以只用手工寫。

更廣泛地說,我會說,最regular language小號可以通過手工更快速的解析(使用正則表達式)。

如果你有很多的規則,並製作解析context-free language,ANTLR(或其他解析器生成器),可以使生活變得更加容易。另外,如果你有一種簡單的語言,你希望將來變得更加複雜,那麼將規則描述添加到ANTLR語法中比將它們構建到手工編碼的解析器中更容易。

2

當您想開發和使用自定義語言時,最好使用諸如ANTLR之類的現成解析器(生成器)。當您的目標是編寫解析器時,最好編寫自己的解析器。

,除非你有很多的經驗寫解析器,並能得到一個工作解析器的方式更快速,除使用ANTLR。但是我從你提出的問題中猜測,這個退出條款並不適用。

4

文法傾向於進化,(與要求一樣)。家庭釀酒解析器難以維護並導致重新發明車輪示例。如果你認爲你可以用java編寫一個快速解析器,你應該知道使用lex/yacc/compiler-compiler解決方案會更快。詞庫比較容易編寫,那麼你會希望自己的規則優先語義不易測試或維護。 ANTLR還提供了一個可視化AST的ide,你能擊敗那個伴侶嗎?增加的好處是能夠使用字符串模板生成中間代碼,這完全是一個不同的方面。