簡體   English   中英

Scalas / Haskells解析器組合器是否足夠?

[英]Is Scalas/Haskells parser combinators sufficient?

我想知道Scalas / Haskells解析器組合器是否足以解析編程語言。 更具體地說,語言MiniJava。 我正在閱讀compiller構建和jflex和java杯是非常痛苦的工作所以我想知道我是否可以/應該使用解析器組合器。 MiniJava語法非常小。 MiniJavas BNF: http//www.cambridge.org/us/features/052182060X/grammar.html

我從未使用過Scala,但是確定的BNF的存在使得這很容易。

簡單地翻譯成Haskell的Text.ParserCombinators.Parsec

goal = do c <- mainClass
          cs <- many classDeclaration
          eof
          return $ c:cs
mainClass = do token "class"
               name <- identifier
               ...

PArrows翻譯也非常簡單。 你可能會發現在解析器之前有一個明顯的lexing階段會更容易,但你也可以不用。

我正在使用Scala的解析器組合來解析PL / SQL代碼,它就像一個魅力。

至少Parsec有類似Java語言的內置詞法分析器:

lexer = makeTokenParser javaStyle

你必須自己定義保留字。

Scala的解析器是一個回溯解析器,所以它幾乎可以處理任何BNF或EBNF。 但是,這也意味着存在邊緣情況,輸入讀取的速度很慢。

如果語法可以改成LL(1)語法 ,你可以使用〜! 操作員將回溯保持在最低限度。

語法可能可以變成LL(1),但是,正如所寫,它不是。 例如,請參閱Expression和Statement有First / First沖突(在鏈接文章的末尾查看)。

無論如何,對於一個學術項目來說,這已經足夠了。 對於現實生活中的編譯器,你需要更快的解析器。

Scala編程 (p.647)說:

它[Scala的解析器組合框架]比解析器生成器更容易理解和適應,並且速度的差異在實踐中通常無關緊要,除非您想要解析非常大的輸入。

因為我不會將源代碼分類為非常大的輸入 (理想情況下),所以它應該足夠了。

我沒有處理Scala或Haskell解析器組合庫,但看起來語法應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM