Как создать конвейер вызова с RX в обходном синтаксическом дереве (AST) в C ++? - PullRequest
0 голосов
/ 20 апреля 2020

Я создал свой собственный язык сценариев, который является pardes, с помощью синтаксического анализатора PEGTL, и я могу создать синтаксическое дерево для выражения этого сценария. Более того, это дерево показывает имя узла, и поэтому я могу отсортировать каждый узел дерева по некоторому функтору . Может быть, это выглядит неудобно для формулы MODULE(5 - 5 + MODULE(5)) / 7:

    digraph parse_tree
{
  x00000193C33855B0 [ label="ROOT" ]
  x00000193C33855B0 -> { x00000193C3392E60 }
  x00000193C3392E60 [ label="struct example::divide" ]
  x00000193C3392E60 -> { x00000193C3392AE0, x00000193C3393020 }
  x00000193C3392AE0 [ label="struct example::function_call" ]
  x00000193C3392AE0 -> { x00000193C3392BC0, x00000193C3393BD0 }
  x00000193C3392BC0 [ label="struct example::key_function\nMODULE" ]
  x00000193C3393BD0 [ label="struct example::add" ]
  x00000193C3393BD0 -> { x00000193C3393AF0, x00000193C33935B0 }
  x00000193C3393AF0 [ label="struct example::minus" ]
  x00000193C3393AF0 -> { x00000193C3393A10, x00000193C3393D90 }
  x00000193C3393A10 [ label="struct example::integer\n5" ]
  x00000193C3393D90 [ label="struct example::integer\n5" ]
  x00000193C33935B0 [ label="struct example::function_call" ]
  x00000193C33935B0 -> { x00000193C3393690, x00000193C3396870 }
  x00000193C3393690 [ label="struct example::key_function\nMODULE" ]
  x00000193C3396870 [ label="struct example::integer\n5" ]
  x00000193C3393020 [ label="struct example::integer\n7" ]
}

Но все же это создает древовидную структуру, которую я могу пройти

enter image description here

Это то, что я искал. Итак, я хочу создать конвейер (может быть вложенным), проходящий через это дерево. Я буду sh сортировать каждый узел с каждым structure, который перегружает operator(). Например,

struct Devide()
{
    double operator()(double firstNumber, double secondNumber)
    {
        secondNumber != 0 ? firstNumber / secondNumber : std::numeric_limits<double>::quiet_NaN();
    }

}

Итак, с изменяющимися шаблонами и функторами я хочу, чтобы эта структура была размещена в последовательности правильного вызова. В конце я хотел бы ожидать эту последовательность (я собираюсь пропустить некоторые скобки конструктора): Devide( FuncCall ( Module, Add ( Minus ( 5, 5 ) , FuncCall ( Module, 5 ) ) ), 7 ) Как распределить эти структуры таким образом, как RX создает конвейеры. Во всяком случае, создавать конвейер RX не обязательно. Может быть, вы предложите что-то еще с существующими инструментами C ++! Спасибо

...