2013-03-19 20 views
7

Sto cercando di corrispondere a questoAnalisi espressione booleana senza ricorsione mano sinistra

f(some_thing) == 'something else' 
  • f (some_thing) è una chiamata di funzione, che è espressione
  • == è un operatore booleano
  • 'qualcos'altro' è una stringa, che è anche un'espressione

quindi l'espressione booleana deve essere

expression operator expression 

Il problema è che non riesco a capire come farlo senza lasciato ricorsione Queste sono le mie regole

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

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

usando la notazione grammatica, ho hanno

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

Perché la mia grammatica è EOE non so come utilizzare l'algoritmo della mano sinistra che è

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

dove E è vuoto e b è un terminale

risposta

5

Qualcosa di simile dovrebbe farlo:

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

Grazie buon signore, che funziona! Ho scoperto prima di questa risposta come farlo e stavo per postarlo, ma hai fatto un lavoro fantastico: P – gosukiwi