2010-08-28 63 views
0

我試圖修改boost :: spirit的mini_c示例以匹配我現有的詞彙表。在boost :: spirit中實現「NOT」mini_c

因此,我增加了一個運營商「不就是應該表現等於爲‘’:

unary_expr = 
     primary_expr 
    | ("NOT" > primary_expr   [op(op_not)]) // This does not work 
    | ('!' > primary_expr    [op(op_not)]) 
    | ('-' > primary_expr    [op(op_neg)]) 
    | ('+' > primary_expr) 
    ; 

我可以編譯修改後的源代碼,但是當我試着執行它時它無法解析我怎麼能。解決這個

編輯: 由於我要訪問外部變量,我不得不爲了建設這些變量列表編譯時做出另一種修改:

identifier %= 
    raw[lexeme[alpha >> *(alnum | '§' | '_' | '.' | '-')]] 
    ; 
variable = 
     identifier  [add_var(_1)] 
    ; 

凡add_var和標識符被定義爲

rule<Iterator, std::string(), white_space> identifier; 
function<var_adder> add_var; 

如果我不使用本變形例中,「NOT」都可以使用。通過修改,使用「NOT」會生成解析錯誤。

編輯2: 以下條件表達式做的工作,雖然:

logical_expr = 
    relational_expr 
    >> *( ("AND" > relational_expr  [op(op_and)]) 
     | ("OR" > relational_expr  [op(op_or)]) 
     ) 
    ; 

回答

2

隨着你的改變小測試:

int main() 
{ 
    return NOT 1; 
} 

成功解析並返回0。所以我不明白什麼對你不起作用。你能提供一個失敗的輸入例子嗎?

+0

我也做了其他修改。請看我編輯的帖子。 – 2010-08-30 11:55:10

+0

您所做的第一項更改('identifier%= ...')與您所看到的問題無關。這是第二個變化('variable = ...'),這是有問題的。基本上你所做的是通過在符號表中盲目地添加任何遇到的標識符來允許隱式變量聲明。這不僅是危險的,而且在你的情況下,還會在表中添加NOT,導致解析時發生錯誤。 – hkaiser 2010-08-30 19:46:36

+0

對不起,我遲到了回答:是的,我們在解析過程中允許任何未知的變量,因爲有數百萬可能的引用,而且它更便宜地檢查解析表達式中的那些少數,而不是將所有可能的值添加到解析器。我雖然理解你的解釋。但是爲什麼邏輯表達式的字符串可以工作(請參閱後期編輯)。非常感謝。 – 2011-04-11 20:05:23