Я делаю генератор парсеров LL (1), мой ввод - спецификация языка CoCo / R. У меня уже есть генератор сканера для этого входа. Предположим, у меня есть следующая спецификация:
COMPILER 1
CHARACTERS
digit="0123456789".
TOKENS
number = digit{digit}.
decnumber = digit{digit}"."digit{digit}.
PRODUCTIONS
Expression = Term{"+"Term|"-"Term}.
Term = Factor{"*"Factor|"/"Factor}.
Factor = ["-"](Number|"("Expression")").
Number = (number|decnumber).
END 1.
Таким образом, если синтаксический анализатор, сгенерированный этой грамматикой, получит слово "1 + 1", он будет принят, то есть будет найдено дерево синтаксического анализа.
Мой вопрос таков: символ «+» никогда не определялся в токене, но он появляется в нетерминальном «выражении». Как мой сгенерированный сканер распознает это? Это не признало бы это как знак.
Это допустимый ввод тогда? Должен ли я добавить этот терминал в TOKENS и затем рассмотреть процедуру ошибки для сканера, чтобы он пропустил его?
Как с этим справляются обычные спецификации языка?