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