2013-03-19 45 views
7

Tôi đang cố gắng để kết hợp nàyPhân tích biểu thức boolean mà không đệ quy tay trái

f(some_thing) == 'something else' 
  • f (some_thing) là một cuộc gọi chức năng, đó là một biểu hiện
  • == là một toán tử boolean
  • 'cái gì khác' là một chuỗi, cũng là một biểu thức

để biểu thức boolean nên

expression operator expression 

Vấn đề là tôi không thể tìm ra cách để làm điều đó mà không cần rời khỏi đệ quy Đây là những quy tắc của tôi

expression 
    = 
    bool_expression 
/function_call 
/string 
/real_number 
/integer 
/identifier 

bool_expression 
    = l:expression space* op:bool_operator space* r:expression 
    { return ... } 

Sử dụng ký hiệu ngữ pháp, tôi có

O := ==|<=|>=|<|>|!= // operators 
E := B|....   // expression, many non terminals 
B := EOE 

Vì ngữ pháp của tôi là EOE Tôi không biết cách sử dụng các thuật toán tay trái đó là

A := Ab|B 
transforms into 
A := BA' 
A':= e|bA 

đâu e là trống rỗng và b là một thiết bị đầu cuối

Trả lời

5

Something như thế này phải làm điều đó:

expression 
= bool_expression 

bool_expression 
= add_expression "==" bool_expression 
/add_expression "!=" bool_expression 
/add_expression 

add_expression 
= mult_expression "+" add_expression 
/mult_expression "-" add_expression 
/mult_expression 

mult_expression 
= atom "*" mult_expression 
/atom "/" mult_expression 
/atom 

atom 
= function_call 
/string 
/real_number 
/integer 
/identifier 

function_call 
= identifier "(" (expression ("," expression)*)? ")" 

string 
= "'" [^']* "'" 

identifier 
= [a-zA-Z_]+ 

integer 
= [0-9]+ 

real_number 
= integer "." integer? 
/"." integer 
+0

Cảm ơn bạn thưa ông tốt, mà làm việc! Tôi đã tìm ra trước câu trả lời này như thế nào để làm điều đó, và sắp sửa đăng nó, nhưng bạn đã làm một công việc tuyệt vời: P – gosukiwi

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