C++ 我無法弄清楚如何寫一個遞歸下降解析器以下語法:如何編寫遞歸下降解析器?
<Datalog Program> -> Schemes : <Scheme List>
Facts : <Fact List>
Rules : <Rule List>
Queries : <Query List>
<EOF>
<Scheme List> -> <Scheme> <Scheme List Tail>
<Scheme List Tail> -> <Scheme List> | ε
<Scheme> -> <Identifier> (<Identifier List>)
<Identifier List> -> <Identifier> <Identifier List Tail>
<Identifier List Tail>-> , <Identifier List> | ε
<Fact List> -> <Fact> <Fact List> | ε
<Fact> -> <Identifier> (<Constant List>) .
<Constant List> -> <String> <Constant List Tail>
<Constant List Tail> -> , <Constant List> | ε
<Rule List> -> <Rule> <Rule List> | ε
<Rule> -> <Head Predicate> :- <Predicate List> .
<Head Predicate> -> <Identifier> (<Identifier List>)
<Predicate List> -> <Predicate> <Predicate List Tail>
<Predicate List Tail> -> , <Predicate List> | ε
<Predicate> -> <Identifier> (<Parameter List>)
<Parameter List> -> <Parameter> <Parameter List Tail>
<Parameter List Tail> -> , <Parameter List> | ε
<Parameter> -> <String> | <Identifier> | <Expression>
<Expression> -> (<Parameter> <Operator> <Parameter>)
<Operator> -> + | *
<Query List> -> <Query> <Query List Tail>
<Query List Tail> -> <Query List> | ε
<Query> -> <Predicate> ?
這是一個簡單的數據記錄樣的語法。我在寫解析器時完全迷失了方向。我已經寫了一個詞法分析器,用於輸出包含所有標記的矢量。我知道我需要爲每個生產編寫方法,但我無法弄清楚如何將標記連接到分析樹(所以我可以在樹完成後運行toString()函數)。我需要指出正確的方向。謝謝。
關於此事有很多文字,在神話龍書Aho,Sethi,Ullman的「編譯器:原理,技術和工具」中。 IIR在Wirth的「算法+數據結構=程序」(可能是他的另一本書)中,對於構建遞歸下降解析器有一個很清晰的解釋。 – vonbrand 2013-02-10 03:22:27
愚蠢的問題:你不能使用像野牛或byacc這樣的工具嗎?以這種方式編寫/維護解析器的源代碼要容易得多。這些(和其他)工具提供了獨立的C程序(或C++也用於野牛)。 – vonbrand 2013-02-10 03:24:40
老實說,正確地考慮文法並消除左遞歸是困難的部分,看起來你已經在那裏了。這件事情應該該死的 - 在這一點上寫*本身*。假設你有一個合適的詞法分析器,你可以把每個生產視爲一個被調用的函數,並且附帶令牌提取以驗證沿途的下一條生產路徑。做出正確的決定,並且*不* *快捷方式,直到你有充分的工作*第一*。 – WhozCraig 2013-02-10 03:27:21