簡體   English   中英

可以用yacc生成Java 1的三個地址碼嗎?

[英]Can yacc be used to generate three address code for Java 1?

我讀過 yacc 為 LALR(1) 語法生成自下而上的解析器。 我有一個 Java 1 的語法,它可用於生成三個地址代碼,嚴格來說是 LALR(1),但我使用的翻譯方案使其具有 L 屬性。 現在我已經讀到 L 屬性的 LR 語法在自下而上解析期間無法翻譯。 那么,這里是否可以使用 yacc? 如果是,yacc 如何解決這個問題?

除非你問一個具體的、詳細的問題,否則你不會得到一個好的答案。 這是一種方法的模糊草圖。

對於自下而上的解析器來說,綜合屬性顯然不是問題,因為它們是在相應終端的最終歸約動作中計算的。 所以問題歸結為“自下而上的解析器如何計算繼承的屬性?”

由於語法是 L 屬性的,我們知道任何繼承的屬性都是從其左兄弟的屬性計算出來的。 Yacc/bison 允許將動作插入右側的任何位置,並且這些“中間規則動作”(MRA)在遇到時執行。 MRA 正好可以使用它的左兄弟姐妹,因此這就是計算繼承屬性所需的全部內容。

但是,這並沒有顯示該屬性實際上是如何被繼承的。 插入到某個規則中的語法符號之前的 MRA 當然可以用於部分計算該符號的繼承屬性,但繼承屬性也可以使用子項的綜合屬性。

為此,我們需要做兩件事:

  1. 在非終結符之前插入一個 MRA,它將左兄弟屬性聚集在一起。 由於 MRA 也是語法符號,因此該 MRA 將是最后一個左兄弟,實際上是終端孩子中最小的叔叔。 (您不一定需要 MRA;您可以插入一個“標記”:一個非終端,其唯一的生產是空的,其動作是 MRA 主體。但這不太方便,因為動作必須達到語義前面的語法符號的值。或者你可以把產生式分成兩部分,這樣兩個動作都是最終的。)

  2. 在終端的還原動作中訪問叔叔的屬性。

    Bison/yacc 通過讓您使用非 positibd 符號索引來引用解析器堆棧中的插槽來允許第二步。 特別是, $0指的是緊接在父產生式中非終結符之前的符號(我在上面稱之為叔叔)。 當然,要做到這一點,您必須確保 uncle 在出現非終結符的每個產生式中都是相同的非終結符(或至少具有相同的語義類型)。 這可能需要添加一些標記。

    說到語義值,你也許可以讓自己滿意,給定非終結符的所有叔叔都是相同的,或者至少具有相同的類型。 但是bison不做這個分析,所以如果你弄錯了它也不會警告你。 小心,作為另一個結果,你必須告訴野牛類型是什么,所以你不能只寫$0 :你需要$<tag>0

筆記:

在 L 屬性的 LR 文法中處理繼承的屬性並不總是可能的,因為在遇到非終結符的那一刻,解析器可能還不知道非終結符實際上將構成分析樹的一部分. 這個問題不會出現在 LL 語法中,因為在 LL 解析中,如果輸入的 rest 有效,解析器只能預測一個非終結符,該非終結符保證存在於解析中。

任何 LL 文法都可以自下而上解析,因此 L 屬性的 LL 文法沒有問題。 但是自下而上的解析器可以做得更好; 它不需要完整的語法是 LL。 只有那些即將被分配繼承屬性的非終端的決策點需要是 LL-deterministic。

這種限制是通過在非終端緊接之前放置 MRA 或標記的技術來實施的。 換句話說,在 LR 語法的某些點添加標記(或 MRA)可能會使 LR 屬性無效。 野牛手冊中對這個問題有很好的討論,所以我在這里不再詳述,只觀察一個細節。

上面概述的用於傳播繼承屬性的技術在戰略點使用 MRA(或標記)來保存繼承屬性。 為了繼續進行解析,必須減少這些產生式,因此如上面提到的野牛手冊部分所述,可能需要重新排列語法以消除沖突。 在極少數情況下,這種重寫甚至是不可能的。

但是,刪除沖突可能仍會導致在某些非終結符需要該值的情況下傳播繼承屬性的語法,而不能保證最終將減少非終結符。 在這種情況下,繼承的屬性將被不必要地計算,然后被忽略。 但這應該不是問題。 屬性概念中固有的概念是屬性是功能性的。 換句話說,計算沒有副作用。

沒有副作用意味着屬性語法解析器應該可以自由地以尊重屬性依賴性的任何順序評估屬性。 特別是,這意味着您可以通過將屬性計算轉換為延續來輕松實現屬性的正確評估,這種技術有時被稱為惰性評估或“thunking”。

但是總是有人想精確地使用 MRA 來產生副作用。 一種非常常見的副作用是將三地址代碼打印到 output stream。 另一種是改變持久性數據結構,例如符號表。 這不再是 L 屬性解析,因此此處提供的建議可能不適用於此類應用程序。

暫無
暫無

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

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