Разбор логического выражения без рекурсии левой руки

Я пытаюсь соответствовать этому

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
Другие вопросы по тегам