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