我已經看到了兩種方法來解析:生成一個解析器程序生成的BNF
使用解析器生成像
happy
。這使您可以在BNF中指定您的語言,而不必擔心解析的複雜性。但是,由於它是一個預處理器,所以必須以文本方式編寫整個分析樹。直接使用解析器
megaparsec
。通過這種方法,你可以直接訪問你的代碼,這樣你就可以以編程方式生成你的解析器,但是你沒有得到快樂的簡單BNF規範的便利,並帶有優先註釋等。同樣,打印出一個BNF樹用於記錄文檔似乎也不是微不足道的您的解析代碼,除非在構建期間考慮到它。
我希望做的是這樣的:
- 生成數據結構編程表示BNF。
- 通過「喜歡」分析器生成器生成分析器。
- 通過漂亮的打印機生成實際的BNF文檔。
我想這樣做的原因是,我正在處理的語法已經變得相當大,並且有很多重複,因爲它的許多構造與其他構造類似,但略有不同。如果可以通過編程方式生成而不是直接修改快樂的BNF規範,那麼它會改進維護工作,但我寧願不必從頭開發自己的解析器。
這裏有一個好方法的任何想法。如果我能夠生成一個數據結構並將其強制爲happy
(因爲它可能會在解析BNF提要後生成它自己的內部結構),但happy
似乎沒有庫接口。
我想我可以生成引爆的BNF,並通過餵養到快樂,但它似乎是一個來回轉換混亂的過程。更清潔的方法會更好。也許即使是一個BNF風格的擴展parsec
或megaparsec
?
那麼爲什麼你不能1)生成一個代表你的BNF的數據結構[我假設你沒有這裏的麻煩],2)漂亮的打印,以產生快樂的BNF規範文本3)餵養快樂? –
對於彼此非常相似的構造,您可能對Happy的參數化製作感興趣。 – Alec
您可能對['BNFC-meta']感興趣(https://hackage.haskell.org/package/BNFC-meta-0.4.0.3),稍微比較一般,因爲它提供了一個元程序(在表單中TH),它將語法的表示轉換爲語法分析器的元表示,當然你可以通過拼接來轉換爲實際的語法分析器。1是'read :: String-> Grammar',2是' ebnf :: Grammar-> DecsQ'(我不確定3是什麼意思 - 什麼是「BNF文檔」?) – user2407038