2010-08-28 32 views
8

Tôi đã thực hiện một số thử nghiệm bằng cách sử dụng mẫu mini_c tinh thần. Đáng tiếc là nó không giữ được ưu tiên điều hành như mong đợi:Ưu tiên vận hành trong tăng cường :: tinh thần?

int main() 
{ 
    return 3 > 10 || 3 > 1; 
} 

đánh giá để 0.

return (3 > 10) || (3 > 1); 

lợi nhuận 1

tôi đã cố gắng để di chuyển các định nghĩa về "||" và "& &" lên đỉnh rất trong constructor của

template <typename Iterator> 
expression<Iterator>::expression(

nhưng điều đó không thay đổi bất cứ điều gì. Làm thế nào có thể được cố định. Tôi đang sử dụng tăng 1.3.38.

+0

Tôi chưa bao giờ sử dụng Boost.Spirit, nhưng tôi không xem bất kỳ thứ gì mà nó định nghĩa có thể tạo ra sự khác biệt ở đây. Bạn không có gì ngoài các nguyên thủy, và bạn không thể quá tải các toán tử dựng sẵn. –

+0

Tôi có một câu hỏi khác xem xét mẫu này. Có lẽ bạn có thể giúp với điều đó? http://stackoverflow.com/questions/3591533/implementing-not-in-boostspirit-mini-c –

Trả lời

7

Đã xác nhận, đó là lỗi trong ví dụ về mini_c liên quan đến quyền ưu tiên của toán tử. Tôi cam kết sửa chữa SVN, sẽ có sẵn trong Boost V1.45. Đây là những gì tôi đã thay đổi trong file header mini_cb.hpp:

mã cũ:

equality_expr = 
    relational_expr 
    >> *( ("==" > relational_expr  [op(op_eq)]) 
     | ("!=" > relational_expr  [op(op_neq)]) 
     ) 
    ; 

relational_expr = 
    logical_expr 
    >> *( ("<=" > logical_expr  [op(op_lte)]) 
     | ('<' > logical_expr   [op(op_lt)]) 
     | (">=" > logical_expr  [op(op_gte)]) 
     | ('>' > logical_expr   [op(op_gt)]) 
     ) 
    ; 

logical_expr = 
    additive_expr 
    >> *( ("&&" > additive_expr  [op(op_and)]) 
     | ("||" > additive_expr  [op(op_or)]) 
     ) 
    ; 

mã mới:

equality_expr = 
    logical_expr 
    >> *( ("==" > logical_expr  [op(op_eq)]) 
     | ("!=" > logical_expr  [op(op_neq)]) 
     ) 
    ; 

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

relational_expr = 
    additive_expr 
    >> *( ("<=" > additive_expr  [op(op_lte)]) 
     | ('<' > additive_expr  [op(op_lt)]) 
     | (">=" > additive_expr  [op(op_gte)]) 
     | ('>' > additive_expr  [op(op_gt)]) 
     ) 
    ; 
+0

Cảm ơn rất nhiều. Tôi đã thử như vậy, nhưng tôi quên thay đổi các tham số bên trong các định nghĩa. –

+1

Xin chào Hartmut. Hôm nay - 1 1/2 Năm sau, tôi phát hiện ra rằng mã vẫn không chính xác: "==" và "&&" phải được đánh giá sau cùng - SAU "==" và "! =", Không phải trước đây. –

Các vấn đề liên quan