2013-07-10 115 views
4

我正在使用github上Zach Carter的reflect.js(一個很好的Javascript解析器);我試圖修改他的解析器的行爲來處理註釋,因爲正常的記號應該像其他任何東西一樣被解析。 reflect.js的默認行爲是跟蹤所有註釋(詞法分析器將它們作爲標記抓取),然後將它們的列表附加到它創建的AST(抽象語法樹)的末尾。評論的語法規則

但是,我希望將這些意見包含在AST中。我相信這個改變將涉及到grammar.y文件here增加語法規則。目前沒有評論規則 - 如果我的理解是正確的,那就是爲什麼他們被主解析代碼忽略。

你如何編寫規則在AST中包含註釋?

+0

我很難想象你想達到什麼 - 除此之外,如果你修改詞法分析器來忽略評論分隔符,它會解析評論作爲我認爲的代碼。 – fvu

+0

@fvu我不認爲我想修改詞法分析器。我*希望在解析器的內部結構中保留註釋,以便當我調用'stringify(AST)'(也在這個項目中)時,它將在它們正確的位置重新生成註釋,嵌套在樹中。但是,我不確定這個問題是否像我希望的那樣直截了當。 – BlackVegetable

回答

3

天真的版本修改了原語法的各個規則

 LHS = RHS1 RHS2 ... RHSN ; 

是:

 LHS = RHS1 COMMENTS RHS2 COMMENTS ... COMMENTS RHSN ; 

雖然這部作品在抽象的,這有可能會搞砸了你的解析器生成,如果它是基於LL或LALR的,因爲現在它看不到足夠遠的地方,只有下一個標記才能決定要做什麼。所以你必須切換到更強大的解析器生成器,比如GLR。

更聰明的版本取代(僅和)每終端 T,帶的非終結:

 T = COMMENTS t ; 

並修改原單詞法分析器trivally EMIT噸代替T.你還有先行煩惱。

但是這給了我們真正解決方案的基礎。

這個更復雜的版本是讓詞法分析器收集在令牌之前看到的評論並將它們附加到它發出的下一個令牌;實質上,我們在詞法分析器中實現語法的終端規則修改。

現在,解析器(您不必切換技術)只能看到它原來看到的令牌;令牌將註釋作爲註釋。你會發現將註釋分成附加到前一個標記的註釋和附加到下一個標記的註釋是有用的,但是你將無法做到比啓發式更好,因爲沒有切實可行的方法來決定評論真正屬於哪個標記。

如果想知道如何捕獲令牌和註釋上的定位信息,以啓用原始文本的再生(「註釋在適當位置」),您會覺得很有趣。您會發現使用適當的基數值,字符串轉義等實際重新生成文本更有趣,但不會破壞語言語法規則。

我們用我們的通用語言處理工具來做這件事,它的工作原理合理。完成這項工作需要多少工作才能實現,這樣才能專注於您的轉型任務。人們低估了這一點。

+0

第一種方法是我提出的方法,但認爲它太容易處理。另外,我會失敗,因爲我正在使用基於LALR的解析器。您的解決方案具有很多優點,但對於我在這項任務中優先考慮的事情而言,工作太多了。 (我最終用一個骯髒的黑客來完全避免這個問題,但這超出了本課題的範圍。) – BlackVegetable