簡體   English   中英

構建Scala解析器組合器代碼的正確方法是什么?

[英]What is the proper way to structure Scala parser combinator code?

因為Scala Parsers庫要求你繼承Parsers子類,最后留下一個特定的Parser實現,看起來你不能真正將它分成多個類或對象,除非它們在類的范圍內最初是Parsers的子類。 處理這個問題的正確方法是什么,所以我不必連續有50個懶惰的val?

就個人而言,我認為這樣做的方法是將所有內容保存在一個類中,或者,如果有意義的話,使用單個繼承層次結構來擴展概念,就像JavaTokenParsers擴展了擴展Parsers RegexParsers一樣。 此外,通過從語法中分離詞匯,使用標記化解析器有點幫助。

除此之外,將它保存在一個地方:分裂語法是一個理解的噩夢。 所有其余的 - AST類,以及對它們進行操作的代碼,不需要與解析器保持一致。

現在,如果這不是你的測試,你可以將它們分成特征,並使用自我類型在特征之間創建必要的依賴關系。 你只需要創建一個繼承了所有特征的大類(或對象)。

您可以將不同的組件拆分為擴展相同父Parser類型的trait ,然后將它們混合在一起以創建最終的解析器。 顯然,一些解析器組合器將依賴於其他解析器,但至少基本解析器(例如終端解析器)可以通過這種方式進行分解。 您可能不希望將其拆分為太多不同的類/特征,否則如果將代碼拆分為太多不同的文件,則可能很難分析解析器正在執行的操作。

暫無
暫無

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

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