2010-08-28 51 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