Parsing 不使用左手递归解析布尔表达式

Parsing 不使用左手递归解析布尔表达式,parsing,grammar,peg,pegjs,Parsing,Grammar,Peg,Pegjs,我正在努力匹配这个 f(some_thing) == 'something else' f(some_thing)是一个函数调用,它是一个表达式 =是一个布尔运算符 'something other'是一个字符串,也是一个表达式 所以布尔表达式应该是 expression operator expression 问题是如果没有左递归,我不知道如何做到这一点 这是我的规则 expression = bool_expression / function_call / st

我正在努力匹配这个

f(some_thing) == 'something else'
  • f(some_thing)是一个函数调用,它是一个表达式
  • =是一个布尔运算符
  • 'something other'是一个字符串,也是一个表达式
所以布尔表达式应该是

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

其中e是空的,b是终端

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

谢谢你,好先生,这很有效!在回答这个问题之前,我确实找到了答案,并准备发布它,但你做得很棒:P
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