2013-03-19 68 views
7

我試圖匹配該解析布爾表達式沒有左手遞歸

f(some_thing) == 'something else' 
  • F(SOME_THING)是一個函數調用,它是一種表達
  • ==是一個布爾運算符
  • '別的東西'是一個字符串,它也是一個表達式

所以布爾表達式應該是

expression operator expression 

問題是我無法弄清楚如何做到這一點沒有左遞歸 這是我的規則

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

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

使用語法符號,我有

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

因爲我的語法是EOE我不知道如何去用左手算法是

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

其中E是空的,b是終端

回答

5

像這樣的東西應該做到這一點:

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

謝謝你的好先生,這作品!在回答這個問題之前,我確實發現瞭如何去做,並準備發佈它,但是你做了一件很棒的工作:P – gosukiwi 2013-03-22 23:38:50