我想寫一個老虎分析器。我最初使用PyPEG,但由於一些困難,我去了琶音。PEG遞歸語法
我的語法很簡單。
def number(): return _(r'[0-9]+')
def string(): return _(r"\".*?\"")
def id(): return _(r'[a-zA-Z][a-zA-Z0-9_]*')
def literal(): return [number, string]
def simple_var(): return id
def let_in_exp(): return 'let', 'in', Optional(ZeroOrMore(exp)), 'end'
param = [number, string]
params = Optional(param, ZeroOrMore(',', param))
def function_call(): return id, '(', params, ')'
exp = [let_in_exp, simple_var, literal, function_call]
def code(): return OneOrMore(exp), EOF
該困難存在於let-in-exp
表達式中。 let in let in let in end end end
是有效的虎。
但是 - 現在 - 琶音不承認let-in-exp
原樣,但三simple-var
。事實上,進入ZeroOrMore(exp)時,它會消耗end
,因此不會爲let-in-exp
找到它。
如何解決此類問題?
我認爲問題是,「讓」,「中」,和「結束」也匹配作爲'id'。我不確定PyPEG如何讓你定義一個負面預測,但是如果你可以在匹配正則表達式之前擴展'id'到* not *匹配關鍵字,那麼我認爲你的遞歸會起作用。 – PaulMcG
我在其他項目中搜索了lookaheads,最後發現'Not()'和'And()'。這解決了它。非常感謝! 無論如何,是不是有更習慣寫PEG語法的方法? – kino