2013-03-19 18 views
7

Próbuję dopasować tenanalizowania wyrażenie logiczne bez lewej ręki rekursji

f(some_thing) == 'something else' 
  • f (some_thing) jest wywołanie funkcji, która jest wyrazem
  • == JEST operator boolowski
  • "coś innego" to ciąg znaków, który jest również wyrażeniem

więc wyrażenie logiczne powinno być

expression operator expression 

Problemem jest to, że nie może dowiedzieć się, jak to zrobić bez lewej rekursji Są to moje zasady

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

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

notacji gramatyki, I ma

Ponieważ moja gramatyka to EOE, nie wiem jak użyć algorytmu lewej stronie, która jest

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

gdzie e jest pusta, a b jest terminal

Odpowiedz

5

Coś jak to powinno wystarczyć:

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

Dziękuję dobry panie, że działa! Dowiedziałem się przed tą odpowiedzią, jak to zrobić, i miałem zamiar to opublikować, ale wykonałeś niesamowitą robotę: P – gosukiwi