Я пытаюсь изучать компиляторы и рекурсивный синтаксический анализ спуска на примере. Это не домашнее задание. Я попытался взглянуть на несколько других ответов, но мне трудно понять их.Анализ рекурсивного спуска для логической грамматики
Пример, который я использую, представляет собой логический синтаксический оператор, который возвращает области, в которых выражение является действительным и недействительным.
Действительный синтаксис - это пробелы, круглые скобки, AND, OR и строчные слова. Строчные слова должны быть разделены булевыми операторами (т. Е. Cat AND mouse).
Некоторые примеры того, как это будет работать:
"cat AND mouse" = "cat <v>AND</v> mouse"
"cat AND mouse OR" = "cat <v>AND</v> mouse <i>OR</i>"
"pet OR ((domestic AND cat)" = "pet <v>OR</v> <i>(</i><v>(</v>domestic <v>AND</v> cat <v>)</v>"
"cat food" = "cat <i>?</i> food"
Как вы можете видеть, что я хочу, чтобы вывести, является ли действительным, окружив его либо «V» тег для действителен каждый скобка и логический оператор или тег «i» для недействительных.
Я считаю, что грамматика языка выглядит следующим образом (пожалуйста, поправьте меня, если я ошибаюсь):
Expression -> 1 or more clauses
Clause -> lowercase_term | (lowercase_term bool_op lowercase_term)
Lowercase_Term -> 1 or more letters from [a-z]
Bool_Op -> AND | OR
Однако, я не слишком уверен, как идти о создании рекурсивного спуска парсер из это. Я предполагаю, что это должно быть какое-то дерево, но просто не уверен.
Для справки, я делаю это на Java, но псевдокод или любой код языка, который поможет мне понять это, будет очень признателен!
Возможно, вы захотите поставить лексический анализатор (лексер) перед парсером. Это выплевывает целые жетоны, такие как «cat», «AND», «mouse» вместо того, чтобы вы анализировали каждый символ в отдельности («c», «a», «t»). – Nayuki