2012-02-26 2 views
0

Итак, я разрабатываю переводчик как язык в качестве проекта. Принятые программы могут состоять из нуля или более деклараций, за которыми следуют ноль или более операторов. Я называю другую (рекурсивную) процедуру для обработки обеих этих возможностей, каждая из которых возвращает либо True после завершения, либо False при ошибке.Python синтаксический ввод как интерпретатор

Декларации можно отличить от утверждений в том, что объявления всегда начинаются с нетерминального «типа» (который сам по себе является другой процедурой, которая возвращает True of False).

Так что мой вопрос заключается в следующем. Мне нужно проверить обе ошибки и когда декларации в начале входного файла закончены. Ниже приведен фрагмент из верхнего слоя, который будет проверять для деклараций и заявлений:

while self.declaration(): 
    #Do stuff 
while self.statement(): 
    #Do stuff 

Так как вы рекурсивно двигаться вниз эти вызовы функций, то в конечном итоге возвращается Истина или Ложь на основе, имеет ли ваш код любые ошибки. Но в то же время мне нужно иметь возможность проверять, нет ли больше деклараций, которые будут перемещаться из цикла declaration() в цикл statement().

Другими словами, в первом цикле код будет возвращать False как при обнаружении ошибки, так и при завершении деклараций. Как это исправить?

ПРИМЕЧАНИЕ. Обе функции перемещают индекс (который извлекает отдельные ключевые слова из кода) вперед в программе, то есть я не могу вызывать дополнительные проверки, чтобы определить, следующий ли тип.

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

Вот образец правового кодекса (игнорирование, будет ли или нет переменные содержат ничего полезного):

int c ?     #Declaration 
if (foo < 3) { 
    a is 7 ? 
} 

Вот пример нелегального кода:

if (foo < 3) { 
    array int [ 3 ] a ? #Declaration 
} 
int c ?     #Declaration 

Суть в том, какие заявления которые сделаны в принятой программе, должны предшествовать всем остальным заявлениям.

+0

Возможно, вы могли бы разместить образец своего языка, в том числе декларации и заявления? –

ответ

0

То, что я закончил, заключалось в том, что выходила на ошибку и считала False как неправильный путь, пройденный по дереву рекурсии. Это было довольно легко и удивительно точно.

Смежные вопросы