Я начал проект с грамматики, которая использовала %
(и слово mod
) для операторов модулей, и теперь я хотел бы добавить %
в качестве конечного унарного оператора, чтобы разделить на 100.
Несколько замечаний: я не работаю с языком на C, я реализовал свой собственный токенизатор / компилятор, используя вывод XML от bison. И мой выбор шагов имеет решающее значение для моей реализации.
Есть ли способ заставить мою грамматику компилироваться без каких-либо ошибок сдвига / уменьшения в компиляторе LALR (1)?
В основном все следующие утверждения действительны:
5%
-> 0,05 5%%5
-> 0,05 мод 5 5%%%5
-> 0,0005 мод 5 et c.
Я просто не знаю, как сформулировать это в моей грамматике:
%token S_NUM
%%
default: mod_term ;
mod_term: _mod_value
| percent_term ;
_mod_value: mod_term O_PERCENT percent_term ;
percent_term: _percent_value
| value ;
_percent_value: value O_PERCENT ;
value: S_NUM ;
%%
Я также скомпилировал ее, используя следующее выражение: bison -v --report=all --warnings=no-other -Werror=conflicts-sr --xml test.y -o test.y.xml
(Где я вынужден сдвигать / уменьшать как ошибки из-за моего окружения)
Есть идеи? Я играл со спецификаторами %left
и %right
, но не повезло.