I'm trying to match this
f(some_thing) == 'something else'
so the boolean expression should be
expression operator expression
The problem is I can't figure out how to do that without left recursion These are my rules
expression 
  = 
  bool_expression
  / function_call
  / string
  / real_number
  / integer
  / identifier
bool_expression
  = l:expression space* op:bool_operator space* r:expression 
  { return ... }
Using grammar notation, I have
O := ==|<=|>=|<|>|!=  // operators
E := B|....           // expression, many non terminals
B := EOE
Because my grammar is EOE I don't know how to use the left hand algorithm which is
A := Ab|B
transforms into
A := BA'
A':= e|bA
Where e is empty and b is a terminal
Something like this ought to do it:
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
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With