我正在使用Java解析文本。我定義以下的語法:使用遞歸正則表達式在Java中Lexing
Start := "(\\<)"
Stop := "(\\>)"
Var = "(\\w*)";
Cons = "([0-9]*)";
Type1 := Start ((Var | Cons) | TypeParent) (Type1 ((Var | Cons) | TypeParent))* Stop
Type2 := Start ((Var | Cons) | TypeParent) (Type2 ((Var | Cons) | TypeParent))* Stop
TypeParent := Type1 | Type2
...
etc
我想所有的正則表達式組合成一個單一的字符串模式搭配的一次。我的問題是當我開始使用Type1
和Type2
行中的遞歸語法元素時。我顯然不能將遞歸定義提供給Java中的模式 - 它只是一個帶正則表達符號的字符串。
我想什麼是我可以在某種程度上有一臺邏輯交換機是說,如果在此塊:除了2型
(Type2 ((Var | Cons) | TypeParent)
所有的模式相匹配,我可以捕獲所有其他羣體,但然後提取應該是Type2標記的字符串,然後將其遞歸地再次送入regexer。最後,我會坐下來的基本情況:
(Var | Cons) | TypeParent)
我知道這是不是正則表達式的意思做 - 這現在是一個上下文無關文法,因爲它是遞歸的(?)。但是,對於一個超級聰明的解析器,我想這種方法是可以破解的。
想法?
真的嗎?似乎我需要一個相當複雜的狀態機...... – lollercoaster
@lollercoaster一個帶有三個產品的語法並不複雜。你根本不需要狀態機。你可以做遞歸下降。我建議你停止猜測,並開始瞭解這些技術的真正含義。 – EJP
你是對的。遞歸下降很容易。用分流碼算法實現 - > RPN - > AST樹完成了這個訣竅。謝謝! – lollercoaster