2015-04-06 18 views
0

我正在使用來自ANTLR4的訪問者在c#中開發解釋器。在我的語法 ,我有一個循環的規則和分配如下規則:如何檢查我的作業是否使用正確的變量?

for_stmt 
: FOR EACH ID IN collection DO NEWLINE+ 
     (block NEWLINE*)? 
    END FOR 
; 

set_stmt 
:SET ID '.' ID TO arithExpr 
; 

block 
: for_stmt 
| set_stmt 
; 

裏面的for循環中,我們可以有一組語句是這樣的:

for each record in recordCollection do 
    set record.name to 10 
end for 

記錄在set語句中使用的內容必須與在循環中使用的記錄相同。我如何檢查這個?

回答

1

你的訪問者可以保持一個堆棧變量定義(範圍):

  • for_stmt的訪問方法,推動變量聲明壓入堆棧(和來訪的子節點後彈出它)
  • 的訪問set_stmt的方法檢查堆棧,並在堆棧上找不到訪問的ID時拋出運行時異常
相關問題