[英]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
到達d
和e
。 我正在嘗試為這些表達式生成一個抽象的語法樹,但是我遇到了麻煩,因為所有運算符都可以在每一側接受任意數量的操作數。 我寧願在遞歸下降解析方法中保留用於生成AST的邏輯,因為它避免了重復提取表達式的邏輯。 我目前的策略如下:
如果出現Value
,則將其推到輸出。
如果出現“ From
或“ To
”:
輸出分隔符。
獲取下一個Expr
。
創建一個Link
節點。
從輸出中將第一組操作數彈出到“ Link
直到出現分隔符。
擦除發現的分隔符。
將第二組操作數彈出到Link
直到出現分隔符。
將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))
為了使用當前策略解決此問題,我需要一種在相鄰表達式之間產生分隔符的方法,但前提是當前表達式是用括號括起來的From
或To
表達式。 如果有可能,那么我只是看不到它,答案應該很簡單。 但是,如果有更好的方法可以解決此問題,請告訴我!
我沒有嘗試對其進行詳細分析,但是:“ From
圓括號括起來的 From
或To
表達式”聽起來很像“上下文相關”,而遞歸下降無法直接處理。 為避免上下文依賴,您可能需要在括號中將From
或To
與沒有括號的From
或To
分開生成。
編輯:盡管做任何事情都為時已晚,但如果我對您要匹配的內容的理解是正確的,我想我會這樣寫:
Graph :=
| List Sep Graph
;
Sep := "->"
| "<-"
;
List :=
| Value List
;
Value := Number
| Identifier
| String
| '(' Graph ')'
;
很難確定,但是我認為這至少應該接近於(僅)匹配您想要的輸入,並且應該使生成可正確反映輸入的AST變得相當容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.