2010-07-07 43 views
0
聲明

我實現基本般的語言,如果語句幾乎相同,以基本的語法:解釋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對於我的語言,但我不知道如何處理分支語句。更確切地說,如果if語句中的expr爲真,我該如何避免評估ELSE語句?謝謝

+0

@Bart對不起,我忘了在這裏提交更改。其實我先在這裏編輯我的問題,然後將它發佈到ANTLR郵件列表中,但也許我忘了應用這些更改。 – ZelluX 2010-07-08 09:50:33

回答

1

如果您使用的是Python,那麼您應該可以使用lambda表達式 - 而不是在解析器操作中返回值,您可以返回lambda表達式並僅在需要時才評估它。

+0

這是一個非常簡單明瞭的方法,非常感謝。 – ZelluX 2010-07-19 10:20:25