Разбор рекурсивного спуска в синтаксическом анализаторе паскаля - PullRequest
0 голосов
/ 10 апреля 2011

У меня есть один вопрос о написании синтаксического анализа рекурсивного спуска для проверки грамматики Паскаля.Например, у меня есть этот код:

a := c ;

Я вижу, что a, c - переменные.: = и;- это терминалы.Это выражение я могу проверить.Но если у меня что-то вроде этого:

a := c + 1 - d ;

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

Для первого примера я написал на C # так:*

if ((!parsing(current_token, "var")) || (!current_token, ":=")) || (  !parsing(current_token, "var") && !parsing(current_token, "const")  ) || (!current_token, "term"))) show_error();

Как мне написать второй пример?Благодарю.

1 Ответ

0 голосов
/ 10 апреля 2011

Переменная присваивания в Pascal имеет следующий BNF

variable := expression 

Так что вам нужно проанализировать выражение после токена :=.Когда вы токенизируете код, вам нужно определить, что является допустимым в качестве следующего токена, поэтому в этом случае вы видите, что у вас есть переменная, за которой следует оператор: =, поэтому вы должны теперь вернуться в функцию синтаксического анализатора выражения.* Написание хорошего парсера выражений имеет решающее значение для парсинга любого языка значений, вы можете найти выражения везде, например, для циклов, операторов If, операторов Case и т. Д.help

http://www2.informatik.uni -halle.de / lehre / pascal / sprache / pas_bnf.html

...