ANTLR Грамматика для цикла while

Привет!

Мне нужна грамматика C для разбора циклов while. Скажем, например, мне нужно разобрать следующий код:

A = 20
B = 1
WHILE(A < 30 )
//function call
A = A + B
ENDWHILE

Мне потребуется разобрать и оценить выражения. Я выполнил несколько шагов и написал грамматику, но это не дает мне желаемого результата. Согласно приведенному выше коду, функция внутри цикла должна вызываться 10 раз после проверки условия.

Во-первых, я сохраняю значения A и B в хэш-таблице (ссылка: структура ANTLR_HASH_TABLE), и правило while выглядит примерно так:

whileStatement : 'WHILE' condExpr 'ENDWHILE'
               ;

Я могу хранить и получать значения из хеш-таблицы, но я застрял с вызовом функции, который должен вызываться/печататься столько раз. Я хотел бы знать, какие шаги следует выполнить, чтобы вызвать/распечатать функцию столько раз.

Любые идеи о том, как это должно быть достигнуто, будут очень полезны.


person sh_ara    schedule 10.07.2013    source источник


Ответы (1)


Для циклов while вы можете использовать предикаты в ANTLR4.

Для примера, который вы опубликовали, вы можете сделать что-то вроде следующего для цикла while: (целевой язык JAVA).

grammar SO;

sampleRule
locals [int A, int B]
:
IDENTIFIER1 '=' INTEGER {$A = Integer.parseInt($INTEGER.text);}
IDENTIFIER2 '=' INTEGER {$B = Integer.parseInt($INTEGER.text);}
(
{$A < 30;}? 
IDENTIFIER1 '=' IDENTIFIER1 '+' IDENTIFIER2
{$A = $A + $B;}
)*
;

IDENTIFIER1
: 'A'
;

IDENTIFIER2
: 'B'
;

INTEGER
: [0-9]*
;

Эта грамматика ограничена конкретным примером, который вы предоставили, но ее не должно быть слишком сложно расширить с помощью приведенной выше грамматики.

person Rishabh Garg    schedule 10.07.2013
comment
Привет, ришаб, приведенная выше грамматика допускает любое количество таких циклов во входном файле. Но цикл while необходимо анализировать до тех пор, пока условие не будет выполнено, что означает, что я должен снова вызвать правило while. Как это сделать? Если я прав, должен ли я реализовать метод синтаксического анализа рекурсивного спуска? - person sh_ara; 15.07.2013