二義性 消除左遞迴

2021-07-03 13:25:24 字數 703 閱讀 1423

書是龍書

編譯器中常用的方法可以分為自頂向下和自底向上的。乙個是從語法分析樹的頂部開始向底部構造語法分析樹,乙個則是從葉子節點開始,逐漸向根結點構造,這兩種分析方法中,語法分析器的輸入總是照著從左向右。

二義性:如果乙個文法可以為某個句子生成多棵語法分析樹,那麼他就是二義性的。

例如例子id + id * id

消除左遞迴

如果乙個文法中有乙個非終結符號a

使得對某個串

a 存在乙個推導

a=>aa 

那麼這個文法就是左遞迴

消除辦法:

a—> aa1| aa2|......aam|β1|

β2|βn

其中βi 

都不以a

開頭,然後將

a的產生式替換為 a—

β1a』 |β

2a』|.....|β

na』a』 —>a1a』|a2a』|a3a』|.....

例子:

多重繼承中二義性的消除

類a派生b和c,類d從b,c派生,如何將乙個類a的指標指向乙個類d的例項?解析 這道題實際上考查的是如何消除多重繼承引起的向上繼承二義性問題。程式 如下所示 class a class b public a class c public a class d public b,public c int...

2 5 3 文法二義性的消除

1 不改變文法中原有的語法規則,僅加進一些語法的非形式規定。例如,對於上例文法 g e 不改變已有的 4 條規則,僅加進運算子的優先順序和結合規則,即 優先於 服從左結合。這樣,對於文法 g e 中的句子 i i i 只有唯一的一棵語法樹 見圖 2.6 從而避免了文法的二義性.2 構造乙個等價的無二...

C 二義性語法

以標準輸入裝置完成初始化操作 以下為錯誤寫法 std dequec std istream iterator std cin std istream iterator 以上c被解析為函式宣告。返回值為std deque,第乙個引數型別為std istream iterator,引數名為cin。第二個...