Невозможно распечатать правильные значения в коде Bison - PullRequest
0 голосов
/ 30 мая 2020

Итак, я пытаюсь объявить синтаксис массива (используя Bison 3.6.2) следующим образом:

array: '[' array_vals ']'

array_vals:
| vals array_vals

vals: STRING //String values defined in my lexer
| FLOAT //Float values defined in my lexer
| INT //Integer values defined in my lexer

Мне кажется, что это довольно понятно, но есть только одна проблема: везде, где Я печатаю array_vals, используя это: array: '[' array_vals ']' { cout << $2 << endl; } Я получаю только первое значение массива в моем исходном коде, поэтому, если у меня есть это в моем исходном файле: [10, 20, 30, 40], тогда он печатает только 10. Я пробовал напечатать vals в array_vals, и это еще более странно и непоследовательно. Я знаю, что это не ошибка, поскольку я перешел с Bison версии 3.5.1 на 3.6.2, и разницы не было. Заранее спасибо!

1 Ответ

1 голос
/ 30 мая 2020

Общий flex+bison совет: заставьте их печатать все, что они делают. Таким образом, лексер будет иметь такие строки:

">=" { cout << ">= on line: " << line << "\n"; return parser::make_GEQ(loc); }

А синтаксический анализатор будет иметь такие строки:

vals:
val      { cout << "vals -> val\n";      $$ = {$1};                  } |
val vals { cout << "vals -> val vals\n"; $2.push_front($1); $$ = $2; } ;
...