Я создал свой собственный язык сценариев, который является 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" ]
}
Но все же это создает древовидную структуру, которую я могу пройти
Это то, что я искал. Итак, я хочу создать конвейер (может быть вложенным), проходящий через это дерево. Я буду 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 ++! Спасибо