Как справиться с невозможностью разбить синтаксические ошибки в парсере рекурсивного спуска - PullRequest
0 голосов
/ 16 октября 2010

В настоящее время я учусь в классе по разработке системного программного обеспечения. Мы пишем двухпроходный ассемблер для языка ассемблера вымышленной машины. Мы реализовали токенизатор, и все классы, которые нам нужны для абстрактного представления этой программы, - все, что осталось (кроме реализации генератора кода на более позднем этапе), - это проанализировать токены. Вот где у меня есть серьезная проблема. Я решил реализовать это как синтаксический анализатор с рекурсивным спуском, поскольку это единственный метод, с которым у меня сейчас есть опыт ... но мы не можем останавливать сборку при синтаксических ошибках. Например, если пользователь дает инструкцию загрузки слова с неверным синтаксисом, мы должны заменить его на NOP. Если пользователь дает плохой ярлык, мы должны просто игнорировать его. Если пользователь помещает неизвестные символы в строку, мы отбрасываем их.

С одной стороны, это звучит легко - однако реализация этого заставляет меня нарушить (как я понимаю, это) одно из важных правил синтаксического анализатора рекурсивного спуска. Каждая из моих функций извлекает несколько токенов перед вызовом другой функции, поскольку мне нужно учитывать все возможные исправимые синтаксические ошибки. Учитывая, что я не могу остановить сборку, и у меня должно быть достаточно информации о моем текущем контексте, чтобы разумно определить, что пользователь намеревался сделать, я должен многое обработать в одной функции.

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

Кстати, мне запрещено использовать такие инструменты, как ANTLR или любой другой генератор синтаксического анализатора.

Спасибо.

1 Ответ

1 голос
/ 16 октября 2010

Мое предложение будет не пытаться.Плохое исправление синтаксической ошибки присуще парсерам рекурсивного спуска.Если вам не разрешено использовать генератор синтаксических анализаторов, то исправление синтаксических ошибок, вероятно, выходит за рамки вашей домашней работы.(Уточните у своего инструктора ...)

...