Я пытаюсь создать интерпретатор Pascal с помощью ANTLR, и в настоящее время у меня возникают проблемы с обработкой циклов при обходе дерева AST. Например, цикл for анализируется как:
parametricLoop
: FOR IDENTIFIER ASSIGN start = integerExpression TO end = integerExpression DO
statement
-> ^( PARAMETRIC_LOOP IDENTIFIER $start $end statement )
;
(вариант с DOWNTO игнорируется). Каким образом я могу заставить ходока повторять выполнение цикла столько раз, сколько необходимо? Я знаю, что для этого я должен использовать input.Mark() и input.Rewind(). Но где именно их нужно поставить? Мой текущий неправильный вариант выглядит так (целевой язык C#):
parametricLoop
:
^(
PARAMETRIC_LOOP
IDENTIFIER
start = integerExpression
{
Variable parameter = Members.variable($IDENTIFIER.text);
parameter.value = $start.result;
}
end = integerExpression
{
int end_value = $end.result;
if ((int)parameter.value > end_value) goto EndLoop;
parametric_loop_start = input.Mark();
}
statement
{
parameter.value = (int)parameter.value + 1;
if ((int)parameter.value <= end_value)
input.Rewind(parametric_loop_start);
)
{
EndLoop: ;
}
;
(надеюсь все понятно). Условие повторения следует проверять перед первым выполнением оператора. Я пытался поиграть с размещением Mark и Rewind в разных блоках кода, включая @init и @after, и даже помещал завершающий goto в начало цикла, но каждый цикл либо повторялся один раз, либо выдавал исключения, такие как Unexpected token, например ':= ' (задание). Я понятия не имею, как заставить это работать правильно, и не могу найти ни одного рабочего примера. Может ли кто-нибудь предложить решение этой проблемы?
Mark()
иRewind(...)
вызываются из вашей древовидной грамматики, верно? Я предполагаю, что они также генерируют исключения? Вы говорите, что знаете, как использовать input.Mark() и input.Rewind(), но кто вам это сказал? Простой интерпретатор на основе дерева см. по адресу: antlr.org/ wiki/display/ANTLR3/Simple+tree-based+interpeter - person Bart Kiers   schedule 02.03.2011mark()
илиrewind(...)
, насколько я знаю. Кроме того, интерпретация таких сложных структур внутри вашей (древовидной) грамматики - это (ИМХО) не лучший путь, и я действительно не вижу здесь быстрого решения для вас. При правильном выполнении получится статья приличного размера, состоящая из нескольких страниц. - person Bart Kiers   schedule 03.03.2011