Как пройти блок if-else в ANTLR? - PullRequest
1 голос
/ 03 апреля 2012

Я написал грамматику для языка (пример кода ниже)

//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, и перейти к другому (если этотам)?
То же самое касается цикла, как я могу оценить предикат цикла в конце цикла?

Спасибо!

1 Ответ

3 голосов
/ 04 апреля 2012

Встраивание кода в грамматику дерева подходит только для очень простых языков (калькуляторы и тому подобное).Внедрение этого (IMO) приведет к непонятному беспорядку смешанных правил грамматики, логики программирования и параметров правила и значений, возвращаемых правилом.Тогда почти каждому правилу понадобится как минимум отслеживание значения boolean, если его (под) правила нужно было выполнить или нет (находится ли оно внутри блока if - или else?).

При интерпретации языка, состоящего из if - и while -статий, какими бы простыми это ни было, я рекомендую создавать собственные деревья / узлы и оценивать их.

Я написал серию блоговэто показывает, как это сделать: http://bkiers.blogspot.com/2011/03/creating-your-own-programming-language.html

...