Итак, я проектирую язык переводчика как проект. Принятые программы могут состоять из нуля или более объявлений, за которыми следует ноль или более операторов. Я вызываю различную (рекурсивную) процедуру для обработки обеих этих возможностей, каждая из которых возвращает либо True при завершении, либо False при ошибке.
Объявления можно отличить от утверждений тем, что объявления всегда начинаются с нетерминального «типа» (который сам по себе является другой процедурой, возвращающей True of False).
Итак, мой вопрос заключается в следующем. Мне нужно проверить обе ошибки и когда объявления в начале входного файла закончены. Ниже приведен фрагмент верхнего слоя, который проверит объявления и операторы:
while self.declaration():
#Do stuff
while self.statement():
#Do stuff
Таким образом, когда вы рекурсивно перемещаетесь по этим вызовам функций, вам в конечном итоге будет возвращено значение True или False в зависимости от того, есть ли в вашем коде какие-либо ошибки. Но в то же время мне нужно иметь возможность проверять, когда больше нет объявлений, которые могли бы перейти от цикла объявления () к циклу оператора ().
Другими словами, в первом цикле код будет возвращать False как при обнаружении ошибки, так и после завершения объявлений. Как мне это исправить?
ПРИМЕЧАНИЕ. Обе функции перемещают индекс (который извлекает отдельные ключевые слова из кода) вперед в программе, что означает, что я не могу вызвать дополнительные проверки, чтобы определить, является ли «тип» следующим.
Может быть, я мог бы прочитать вперед (используя этот индекс) перед запуском парсера и посчитать количество объявлений в коде, а затем вызвать объявление () для количества обнаруженных объявлений. Кто-нибудь может придумать лучшее решение? Спасибо за вашу помощь.
Вот пример юридического кода (независимо от того, будут ли переменные содержать что-нибудь полезное):
int c ? #Declaration
if ( foo < 3 ) {
a is 7 ?
}
Вот пример нелегального кода:
if ( foo < 3 ) {
array int [ 3 ] a ? #Declaration
}
int c ? #Declaration
Суть в том, что любые заявления, сделанные в принятой программе, должны предшествовать всем остальным заявлениям.