簡體   English   中英

從具有遞歸關系的該語法產生表達式

[英]Producing Expressions from This Grammar with Recursive Descent

我有一個簡單的語法。 實際上,我使用的語法更復雜,但這是說明我的問題的最小子集。

Expr ::= Value Suffix
       | "(" Expr ")" Suffix

Suffix ::= "->" Expr
         | "<-" Expr
         | Expr
         | epsilon

Value與標識符,字符串,數字等匹配。 Suffix規則可以消除左遞歸。 這匹配如下表達式:

a -> b (c -> (d) (e))

即,一個圖形,其中a既到達b又到達(c -> (d) (e)) ,而c到達de 我正在嘗試為這些表達式生成一個抽象的語法樹,但是我遇到了麻煩,因為所有運算符都可以在每一側接受任意數量的操作數。 我寧願在遞歸下降解析方法中保留用於生成AST的邏輯,因為它避免了重復提取表達式的邏輯。 我目前的策略如下:

  1. 如果出現Value ,則將其推到輸出。

  2. 如果出現“ From或“ To ”:

    1. 輸出分隔符。

    2. 獲取下一個Expr

    3. 創建一個Link節點。

    4. 從輸出中將第一組操作數彈出到“ Link直到出現分隔符。

    5. 擦除發現的分隔符。

    6. 將第二組操作數彈出到Link直到出現分隔符。

    7. Link推到輸出。

如果我不遵循步驟2.3-2.7進行操作,則會得到值和分隔符的列表。 對於上面引用的表達式a- a -> b (c -> (d) (e)) ,輸出應為:

A sep_1 B sep_2 C sep_3 D E

應用To規則將產生:

A sep_1 B sep_2 (link from C to {D, E})

隨后:

(link from A to {B, (link from C to {D, E})})

需要注意的重要一點是,對於分隔第二個->的左操作數至關重要的sep_2不會出現,因此解析器認為該表達式實際上是這樣寫的:

a -> (b c -> (d) (e))

為了使用當前策略解決此問題,我需要一種在相鄰表達式之間產生分隔符的方法,但前提是當前表達式是用括號括起來的FromTo表達式。 如果有可能,那么我只是看不到它,答案應該很簡單。 但是,如果有更好的方法可以解決此問題,請告訴我!

我沒有嘗試對其進行詳細分析,但是:“ From 圓括號括起來的 FromTo表達式”聽起來很像“上下文相關”,而遞歸下降無法直接處理。 為避免上下文依賴,您可能需要在括號中將FromTo與沒有括號的FromTo分開生成。

編輯:盡管做任何事情都為時已晚,但如果我對您要匹配的內容的理解是正確的,我想我會這樣寫:

Graph := 
       | List Sep Graph
       ;

Sep := "->"
     | "<-"
     ;

List :=
      | Value List
      ;

Value := Number 
      | Identifier 
      | String 
      | '(' Graph ')'
      ;

很難確定,但是我認為這至少應該接近於(僅)匹配您想要的輸入,並且應該使生成可正確反映輸入的AST變得相當容易。

暫無
暫無

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

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