Разбор логического выражения без рекурсии левой руки
Я пытаюсь соответствовать этому
f(some_thing) == 'something else'
- f(some_thing) - это вызов функции, который является выражением
- == это логический оператор
- "что-то еще" является строкой, которая также является выражением
поэтому логическое выражение должно быть
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
Поскольку моя грамматика EOE, я не знаю, как использовать алгоритм левой руки, который
A := Ab|B
transforms into
A := BA'
A':= e|bA
Где e пусто, а b является терминалом
1 ответ
Решение
Нечто подобное должно сделать это:
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