2013-07-10 2 views
0

Привет там,ANTLR грамматики для цикла While

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

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

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

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

whileStatement : 'WHILE' condExpr 'ENDWHILE' 
       ; 

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

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

ответ

-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]* 
; 

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

+0

Привет rishab, вышеупомянутая грамматика принимает любое количество таких циклов во входном файле. Но цикл while должен анализироваться до тех пор, пока условие не будет выполнено, что означает, что я должен снова вызвать правило while. Как это сделать? Если я прав, должен ли я использовать метод рекурсивного анализа спуска? –

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