Я написал грамматику для языка (пример кода ниже)
//this is a procedure
procedure main()
$i := 0
begin
if ($i = 0)
$i := 10
loop while ($i != 0)
print($i)
$i := $i - 1
end loop
end if
end procedure
Древовидная грамматика для которой
@members {
private Map<String, Integer> variablesTable = new HashMap<String, Integer>();
}
procedure
: ^('procedure' IDENTIFIER assignment_expression* 'begin' statement+)
;
statement
: assignment_expression | selection_statement
;
assignment_expression
: ^(':=' IDENTIFIER e=expression)
{ variablesTable.put($IDENTIFIER.text, e); }
;
expression returns [int result]
: ^('+' op1=expression op2=expression) { result = op1 + op2; }
/* removed similar lines */
| IDENTIFIER { result = variablesTable.get($IDENTIFIER.text); }
| INTEGER { result = Integer.parseInt($INTEGER.text); }
;
equality_expression returns [boolean truth]
: ^('=' op1=expression op2=expression) { truth = op1 == op2; }
| ^('!=' op1=expression op2=expression) { truth = op1 != op2; }
;
selection_statement
: ^('if' e=equality_expression block1=statement+ ('else' block2=statement+)? )
{
if (e) {
//What do I put here?
}
}
;
Хотя я могу оценивать выражения, печатать сообщения и т. Д.,Я не могу понять, как изменить исполнение (интерпретацию) программы.
Как и в приведенном выше коде, для if-else, как я могу выполнить if-block в случае, если предикат имеет значение true, и перейти к другому (если этотам)?
То же самое касается цикла, как я могу оценить предикат цикла в конце цикла?
Спасибо!