Может ли кто-нибудь рассказать мне, что этот вопрос пытается мне задать? - PullRequest
1 голос
/ 08 февраля 2020

Следующий вопрос о языках программирования кажется действительно неясным, и то, что он хочет, чтобы я сделал, не очевидно для меня, может ли кто-нибудь помочь мне понять это?

Вопрос:

Реализация части парсер рекурсивного спуска для простого набора языковых правил. Используйте любой язык программирования для реализации; если это не общий язык, пожалуйста, запишите, на каком языке он находится в комментарии. Вы должны реализовать функции для каждого нетерминального символа и, используя следующие правила, которые описывают часть C -подобного языка.

<ifblock> --> if(<logic_expr>){<stmts>} [else {<stmts>}]

<logic_expr> --> <value> == <value> | <value> != <value>

Вы можете принять следующие функции:

  • lex (), лексический анализатор, который помещает код для следующего токена в глобальную переменную next token

  • stmts ()

  • значение ()

Клеммные символы должны быть закодированы со следующими определенными константами:

  • CODE LP для '('

  • КОД RP для ')'

  • КОД LB для '{'

  • КОД RB для ' {'

  • Код эквалайзера для' == '

  • Код NEQ для'! = '

  • КОД IF для 'if'

  • CODE ELSE для 'else'

1 Ответ

2 голосов
/ 08 февраля 2020

Из того, что я вижу: вас просят написать две функции

  • ifblock
  • logic_expr

как часть синтаксический анализатор с рекурсивным спуском.

Для других нетерминальных символов, stmts и value, вам разрешено предположить существование предварительно написанных функций с такими же именами.

Как написать анализатор рекурсивного спуска должен был обсуждаться в лекциях и руководствах, поэтому я предполагаю, что вы знаете, как это работает.

Чтобы получить следующий токен из входного потока, вы можете вызвать lex(), который возвращает код, как указано в кодах для символов терминала. Вам нужно реализовать ifblock, запросив коды токенов, позвонив по номеру lex(), и оценить и сопоставить их с необходимыми токенами в соответствии с грамматикой языка. Обратите внимание, что часть else в ifblock является необязательной в соответствии с грамматикой.

Чтобы оценить логическое выражение if, вам нужно перейти к функции logic_expr, которую вы запрашиваете чтобы написать, который оценивает логическое выражение, как определено в грамматике. Опять же, вы можете предположить, что функция для нетерминала value уже существует.

...