Примеры, которые я встречал в некоторых статьях и книгах, всегда показывают, как работать с грамматикой, которая в конечном итоге вычисляет только числовые значения.
Я создал собственную грамматику для своего языка, но у этого языка есть особенность. Для объяснения того, о чем я говорю, давайте рассмотрим одну функцию, которая анализирует абстрактное синтаксическое дерево (этот пример из книги):
eval(struct ast *a)
{
double v;
if(!a) {
yyerror("internal error, null eval");
return 0.0;
}
switch(a->nodetype) {
/* constant */
case 'K': v = ((struct numval *)a)->number; break;
/* name reference */
case 'N': v = ((struct symref *)a)->s->value; break;
...
}
Видите, оно будет работать только с числами, ноесли я хочу работать с контейнерами STL и в то же время хочу, чтобы eval
вернул число, строку или что-то еще. Можно ли таким образом разобрать дерево?
У меня есть собственный язык. Пусть он имеет две функции: ROUND
и SORT
. Оба могут получать числа, строки или контейнеры. Я представляю, как создать грамматику для анализа этих функций, но как оценить, например, ROUND(SORT([1,2,3,4]))
, если я хочу, чтобы eval
для SORT
вернул контейнер с типом, который совпадает с входными параметрами? Возможно ли это?