2017-04-14 56 views
0

我試圖創建一個包含所有函數名稱的地圖。我可以在掃描階段或解析階段執行此操作,但似乎無法獲得可供兩者訪問的相同變量。Javacc我如何使一個變量可以訪問掃描儀和分析器

我需要的是在開始解析之前將所有函數名保存在地圖中,因爲函數可以在被調用的地方之下聲明。所以我需要檢查該函數是否存在。

我嘗試過使用令牌管理器聲明,它允許我在每次看到地圖時向地圖添加令牌。但後來我需要funcs變量才能被解析器看到,因此它可以檢查函數是否存在。

TOKEN_MGR_DECLS : { 
     public static Map funcs = new HashMap(); 
    } 
    TOKEN : { 
     <FNAME: (["A"-"Z"])+ > { funcs.put(matchedToken.image, "..");} 
    } 

這是我得到的最接近,我試圖在文件的.jj一個全局變量,僅低於PARSER_BEGIN(..),並宣佈它的主要功能之內。當嘗試向地圖添加函數名稱時,這兩者都會導致出現「符號無法找到」錯誤。

感謝您的任何幫助。

+0

請記住,掃描和解析是在同一遍中完成的。 –

回答

1

首先,我不得不說,我建議不要在解析器和詞法分析器之間共享任何變量。這是因爲詞法分析器可以提前做好解析器這意味着的:

  • 如果變量詞法分析器書面和解析器讀取,信息可能是過時的(即覆蓋)的時候解析器讀取它。

  • 如果變量是由解析器編寫並由詞法分析器讀取的,那麼當詞法分析器需要時,解析器可能不會寫入詞法分析器需要的信息。

這就是說。如果你需要這樣做。這是一種方法。聲明你的變量令牌經理這樣

TOKEN_MGR_DECLS : { 
    Map funcs = new HashMap(); 
} 

然後,在解析器,你可以訪問變量token_source.funcs

如果您使用STATIC=true選項,則該變量應爲static

0

讓想清楚你想知道javacc解析器的流程。

實際的JavaCC進程以解析器部分開始,該部分調用TokenManager以通過調用getNextToken()方法返回要處理的標記。哪個實習生將字符流(SimpleCharStream或JavaCharStream)調用爲向TokenManager逐個字符地返回。

Parser 
    /|\ 
    | getNextToken() 
    \|/ 
TokenManager 
    /|\ 
    | readChar() 
    \|/ 
SimpleCharStream