2012-09-20 83 views
15

是否有解析器生成器也實現了相反的方向,即從相同的語法規範中解析域對象(又名漂亮打印)?據我所知,ANTLR不支持這一點。組合的解析器/解析器生成器

+0

似乎很難當你有任意的動作,但有一個屬性語法它似乎很容易......我迫不及待地想要被一個聰明的答案謙卑:D – delnan

+0

@delnan:事實上,與一個屬性語法「很容易」。看我的答案; prettyprinter規範是一個有趣的語法屬性語法。 –

回答

0

這是不可能的一般。

什麼使打印漂亮?如果空格,製表符或換行符位於這些位置,打印效果非常好,這使得打印效果很好。

但大多數語法忽略空格,因爲在大多數語言中,空格不重要。有像Python這樣的例外,但總的來說,這個問題,使用空格作爲語法是否是個好主意,仍然存在爭議。因此,大多數語法不使用空格作爲語法。

如果抽象語法樹不包含空格,因爲解析器已經將它們扔掉了,所以沒有生成器可以使用它們來漂亮地打印AST。

+0

我在想這個。一些語法(比如C語言)爲白色空間等東西提供了很大的靈活性。但有些語法不會,所以任何打印機都會自動成爲一臺漂亮的打印機。但是,似乎你可以用關於哪個選項是「漂亮」的信息來註釋語法,然後你可以從中生成一個漂亮的打印機。 –

1

我們的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。

1

有幾個解析器生成器包含unparser的實現。其中之一是用於上下文無關語法的解析器生成器nearley