Как рассчитать значения в Bison с помощью абстрактного синтаксического дерева, если они должны иметь разные типы? - PullRequest
0 голосов
/ 01 ноября 2019

Примеры, которые я встречал в некоторых статьях и книгах, всегда показывают, как работать с грамматикой, которая в конечном итоге вычисляет только числовые значения.

Я создал собственную грамматику для своего языка, но у этого языка есть особенность. Для объяснения того, о чем я говорю, давайте рассмотрим одну функцию, которая анализирует абстрактное синтаксическое дерево (этот пример из книги):

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 вернул контейнер с типом, который совпадает с входными параметрами? Возможно ли это?

...