2015-06-29 99 views
2

我有一個代碼:關於Java編譯器的階段

package pack; 
public class St 
{ 
    public static void main(String args[]) 
    { 
     Int y=9; 
     display(23,1); 
    } 
} 
class Animals 
{ 
    void display(int a,int b) 
    { 
     System.out.println("I am Animal Class"); 
    } 
} 

我想知道爲什麼編譯器只顯示第一次在網上Int y=9,它爲什麼不同時顯示兩個錯誤,即錯誤,如果我正確的Intint,那麼它在display(23,1)中顯示錯誤。我知道編譯器可以分階段工作,有人可以解釋各個階段和他們的工作,如果你可以請示例幫助解釋階段,那麼我將非常感激。我想知道如果在一個階段發生錯誤,那麼下一個連續的階段是否被檢查?

+1

我猜這將取決於具體使用什麼編譯器。您是否嘗試了Oracle JDK和OpenJDK,並確認它們在此處具有相同的行爲? –

+1

您正在使用哪種編譯器?我剛剛使用OpenJDK 1.7.0_65中的javac嘗試了它,並且它立即顯示了這兩個錯誤。 –

+0

我正在使用oracle JDK 1.8.0_45 –

回答

2
$ javac St.java 
St.java:6: error: cannot find symbol 
     Int y=9; 
     ^
    symbol: class Int 
    location: class St 
St.java:7: error: cannot find symbol 
     display(23,1); 
     ^
    symbol: method display(int,int) 
    location: class St 
2 errors 
$ javac -Xmaxerrs 1 St.java 
St.java:6: error: cannot find symbol 
     Int y=9; 
     ^
    symbol: class Int 
    location: class St 
1 error 

本地與JDK 1.7和CodingGrouding與JDK 1.8,我得到這兩個錯誤。

如果我不得不猜測我會說這是一個特定於編譯器的行爲。有人可能會爭辯說,你不會同時修正所有的錯誤,或者一個不正確的變量聲明可能會導致大量的誤報,因此顯示所有錯誤可能不相關。

關於階段,對compilers維基百科的文章中提到

詞法分析,預處理,解析,語義分析 (語法制導翻譯),代碼生成和代碼優化

+1

「如果你有詞彙錯誤(例如,無效字符),編譯器實際上不會真正費力地通過語法分析來獲取文件。」這通常是不正確的,因爲大多數詞法分析器懶洋洋地工作,因爲他們實際上不會分析整個文件在分析開始之前進行,而是每當解析器請求更多的標記時分析一次。因此,解析器在請求新標記並且詞法分析器發現無效標記時已經開始分析時會發生詞法錯誤。 – sepp2k

+0

夠公平的,我刪除了那一點,它可能是誤導。 – Vlad

2

做完在我的學校時間裏一個自定義的編譯器,我發現一些編譯器從上到下工作,因此我們首先得到最多的錯誤。在我的編譯器類中,我們瞭解到編譯器一次只能處理一個字符。它可以檢測什麼時候像Int y = 9;當它開始拾取(i-n-t)部分時。它知道或期望接下來的幾個字符(如「y」)是變量,後跟數字或分號。如果你想了解更多,我建議閱讀或查找特定的編譯器,以及它們的工作原理。他們如何通過.java文件解析或通過.cpp文件解析。希望它有幫助

+0

你可以請建議一些網站或一些書??? –

+1

這是我做過的一個實例,但你必須看看它是如何工作的。 https://www.dropbox.com/s/0i77lrwjmxa9qhp/4_28_14notes.docx?dl = 0 –

+0

未解析的符號不是解析錯誤。解析器的工作方式不會影響如何處理這些錯誤。 – sepp2k