是否有解析器生成器也實現了相反的方向,即從相同的語法規範中解析域對象(又名漂亮打印)?據我所知,ANTLR不支持這一點。組合的解析器/解析器生成器
回答
這是不可能的一般。
什麼使打印漂亮?如果空格,製表符或換行符位於這些位置,打印效果非常好,這使得打印效果很好。
但大多數語法忽略空格,因爲在大多數語言中,空格不重要。有像Python這樣的例外,但總的來說,這個問題,使用空格作爲語法是否是個好主意,仍然存在爭議。因此,大多數語法不使用空格作爲語法。
如果抽象語法樹不包含空格,因爲解析器已經將它們扔掉了,所以沒有生成器可以使用它們來漂亮地打印AST。
我在想這個。一些語法(比如C語言)爲白色空間等東西提供了很大的靈活性。但有些語法不會,所以任何打印機都會自動成爲一臺漂亮的打印機。但是,似乎你可以用關於哪個選項是「漂亮」的信息來註釋語法,然後你可以從中生成一個漂亮的打印機。 –
我們的DMS Software Reengineering Toolkit正是這樣做的(並且爲分析/轉換代碼提供了很多額外的支持)。
它有助於瞭解DMS直接基於語法生成樹。
每個DMS語法規則都與所謂的「漂亮打印」規則配對。每個漂亮的打印規則都描述瞭如何「相當」打印由其相應規則識別的語法元素。漂亮的打印過程實質上是將水平或垂直的矩形文本框(帶有可選的縮進)組合起來,其中葉子產生包含葉的文字值(關鍵字,操作符,標識符,常數等)的單位高度框。
作爲示例如下
for (i=x*2;
i--; i>-2*x) { a[x]+=3;
b[x]=a[x]-1; }
和prettyprint它:,人們可能會編寫以下DMS語法和以漂亮的規則:
statement = 'for' '(' assignment ';' assignment ';' conditional_expression ')'
'{' sequence_of_statements '}' ;
<<PrettyPrinter>>:
{ V(H('for','(',assignment[1],';','assignment[2],';',conditional_expression,')'),
H('{', I(sequence_of_statements)),
'}');
這將解析以下
for (i=x*2;i--;i>-2*x)
{ a[x]+=3;
b[x]=a[x]-1;
}
DMS還捕獲註釋,將它們附加到AST節點,並在輸出時重新生成它們。 這個實現是異乎尋常的,因爲大多數解析器不處理註釋,但是使用很容易,甚至是「免費」;評論將被自動插入到他們原始位置的美麗結果中。
DMS也可以「保真」模式打印。在這種形式下,它會嘗試將列偏移量保存到解析標記的行中。這會導致原始文本重新生成。
關於漂亮打印機必須做的更多細節在我的SO回答Compiling an AST back to source code中提供。 DMS乾淨地處理所有這些主題。
此功能已被DMS用於40多種實際語言,包括完整的IBM COBOL,PL/SQL,Java 1.8,C#5.0,C(許多方言)和C++ 14。
有幾個解析器生成器包含unparser的實現。其中之一是用於上下文無關語法的解析器生成器nearley。
- 1. F#解析器組合器
- 2. 無掃描器解析器生成器
- 3. 哪個解析器:EBNF,自定義,解析器組合器(及其衍生物)?
- 4. 清除野牛生成解析器的解析器狀態
- 5. 解析器組合信息
- 6. 目標C的解析器生成器?
- 7. 在Haskell中使用解析器組合器庫編寫的分析解析器
- 8. 解析器組合器的枚舉值
- 9. 斯卡拉解析器組合器:解析流
- 10. Scala解析器組合器:有效地解析C-Style註釋
- 11. 使用Scala解析器組合器解析句子
- 12. 斯卡拉句子解析使用解析器組合器
- 13. Common Lisp的詞法分析器和解析器生成器
- 14. 多語言解析器生成器
- 15. 製作Sable CC解析器生成器
- 16. scala解析器組合器stackoverflow遞歸
- 17. 解析器組合器 - 簡單語法
- 18. 解析器組合器選擇庫(haskell)
- 19. 解析器組合器可選部分
- 20. 瞭解解析器組合〜輸出
- 21. 理解`not`在解析器組合
- 22. ANTLR生成的解析器產生MissingTokenException
- 23. 解析器和詞法分析器生成器php
- 24. Dojo解析器 - 解析完成?
- 25. 使用Scala/SBT解析器組合器重複依賴解析器
- 26. 使用解析器組合器構造類型檢查解析器
- 27. 調試解析器生成的代碼
- 28. 序列解析器的混合使用和期望解析器
- 29. Option.Applicative:如何解析帶有標誌的組合解析器?
- 30. Visual Studio解析器解析器
似乎很難當你有任意的動作,但有一個屬性語法它似乎很容易......我迫不及待地想要被一個聰明的答案謙卑:D – delnan
@delnan:事實上,與一個屬性語法「很容易」。看我的答案; prettyprinter規範是一個有趣的語法屬性語法。 –