Распознавание терминалов в производстве CFG, ранее не определенных как токены - PullRequest
0 голосов
/ 30 мая 2010

Я делаю генератор парсеров 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 и затем рассмотреть процедуру ошибки для сканера, чтобы он пропустил его?

Как с этим справляются обычные спецификации языка?

1 Ответ

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

Все, что находится в RHS правила грамматики (это не является частью самой грамматической нотации), должно быть либо нетерминальным символом, либо терминальным символом (синонимом "token"). Так что да, вы должны сделать свои токены операторов. Глядя на документацию CoCo / R, кажется, что она принимает буквенные строки в качестве терминальных символов в разделе PRODUCTIONS, поэтому вам, возможно, больше не придется ничего делать ... генератор синтаксических анализаторов уже должен рассматривать их как токены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...