2009-07-10 15 views
1

當我開始堆棧溢出,是時候來這裏問我想通的時候;)我不斷收到堆棧溢出試圖用精神來分析的東西

我想學習如何使用升壓精神權現在。我已經想出了基本的東西。由於我有K & R方便(其中包含C的語法),我決定看看我是否可以成爲該語言的接受者。無論如何,這或多或少是我最初的目標,因爲我最終希望將其用作預處理器,從數據結構和內容中收集一些信息。

我能解析常量和字符串,但是當我嘗試解析這個時,我開始有問題。

postfix_expression = 
    primary_expression 
    // omitting some other rules for simplicity's sake 
    | (postfix_expression >> chseq+p("++")) 
    | (postfix_expression >> chseq_p("--")); 

primary_expression = 
    identifier 
    | constant 
    | string_literal; 

// The parsers for constants and strings are 
// pretty trivial so I'm not going to C+P them here. 

當我通過類似i++的東西時失敗。我認爲這是因爲i是有效的primary_expression,所以它不會繼續檢查++--。我試着把它放在底部,然後我得到堆棧溢出。我在這裏得到了一些無限的左遞歸,但我不知道如何解決它。

回答

2

你將不得不擺脫左遞歸。這篇Wikipedia文章解釋了一些技巧:

http://en.wikipedia.org/wiki/Left_recursion

但是,它可能是不可能的。 C有一個非常靈活的語法,可能不會提供足夠的上下文來允許遞歸下降解析器的功能,除非Boost Spirit允許回溯。或者你可以做到,但協會會倒退。

您最好使用基於LALR的工具,如野牛。