2010-07-07 1 views
0

Я реализует BASIC-подобный язык, синтаксис, если заявления почти то же самое BASIC:Устный IF заявления в ANTLR

IF a == b THEN 
    PRINT "EQUAL" 
ELSE 
    PRINT "UNEQUAL" 
ENDIF 

меня написать файл грамматики для синтаксического анализа и дерево Уолкер переводчик языка:

[Expr.g] 
options { 
    language=Python; 
    output=AST; 
    ASTLabelType=CommonTree; 
} 

tokens { 
    BLOCK; 
} 

block 
    : stmt* -> ^(BLOCK stmt*) 
    ; 

if_stmt 
    : 'IF' c=expr 'THEN' t=block ('ELSE' f=block)? 'ENDIF' 
     -> ^('IF' $c $t+ ^('ELSE' $f+)) 
    ; 

В AST ходок:

[Walker.g] 
options { 
    language=Python; 
    tokenVocab=Expr; 
    ASTLabelType=CommonTree; 
} 

block 
    : ^(BLOCK stmt*) 
    ; 

stmt 
    : ... 
    | 'IF' expr t=stmt* 'ELSE' f=stmt* 
     {} 

Теперь я могу правильно генерировать AST для моего языка, но я не знаю, как обрабатывать инструкцию ветви. Чтобы быть более точным, если значение expr в if является истинным, как я могу избежать оценки инструкции ELSE? Спасибо

+0

@Bart Извините, что я забыл внести изменения здесь. На самом деле сначала я редактирую свой вопрос, а затем отправил его в список рассылки ANTLR, но, возможно, я забыл применить изменения. – ZelluX

ответ

1

Если вы используете Python, то вы должны иметь возможность использовать лямбда-выражения - вместо этого, возвращая значение в действиях парсера, вы можете вернуть лямбда-выражение и оценить его только тогда, когда это необходимо.

+0

Это действительно простой и понятный способ сделать это, большое спасибо. – ZelluX