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