2010-09-09 43 views
3

我在爲我的計算機語言課授課時有這個問題。我試圖弄清楚每個人的意思,但我陷入了困境。在計算機程序編譯期間和運行時的錯誤類型

錯誤可以根據當它們檢測到 被 分類,並且如果它們在 編譯時檢測到,什麼 編譯器的一部分檢測到它們。使用您 喜歡的編程語言,給出的 例如:

(一)詞法錯誤,由 掃描儀檢測。

(b)語法錯誤,由 解析器檢測到。 (c)一個靜態語義錯誤,檢測到 (在編譯時)通過語義 分析。 (d)動態語義錯誤, 編譯器生成的代碼在運行時檢測到 。

對於(一),我認爲這是將是正確的:int char foo;

對於(B),int foo(別無分號)

對於(c)和(d),我不確定被問到的是什麼。

感謝您的幫助。

回答

3

我會給它一個鏡頭。這是我的想法:

a。 int foo +; (foo +是無效標識符,因爲+不是標識符中的有效字符)

b。 foo int; (語法錯誤是語法無效的任何錯誤 - 或者是由於錯誤的文字,錯誤的拼寫,缺少分號等造成的)

c。靜態語義錯誤是邏輯錯誤。例如傳遞float作爲數組的索引 - arr [1.5]應該是SSE。

d。我認爲像NullReferenceException這樣的異常可能是DME的一個例子。不完全確定,但在編譯時(在某些語言中)引發異常的協同返回可能也會出現在這一類中。另外,在另一個對象中傳遞錯誤類型的對象(例如,在運行時傳遞一個Person對象中的Cat可能有資格獲得DME。)最簡單的示例是試圖訪問超出數組範圍的索引。

希望這會有所幫助。

3

我認爲了解掃描器是什麼,解析器是什麼以及它們如何參與編譯過程非常重要。

(我會盡我所能,在一個高層次的解釋)

掃描儀採用的字符序列(源文件),並將其轉換爲標記序列。例如,看到文本if 234)並轉換爲令牌,IFINTEGERRPAREN(還有更多,但應該足夠用於該示例)。

您可以考慮掃描儀的工作方式的另一種方式是,它需要文本並確保您使用正確的關鍵字,而不是使它們成爲現實。它必須能夠將整個源文件轉換爲相關語言的識別令牌,並且這種語言會因語言而異。換句話說,「每一段文字是否對應一種語言理解的結構」。或者更好地舉一個例子,「在書中找到所有這些詞,屬於英語嗎?」


解析器需要一系列令牌(通常來自掃描儀)和(除其他外)看看它是否形成良好。例如,C變量聲明的格式爲Type Identifier SEMICOLON

解析器檢查「這個順序的令牌按照這個順序對我有意義嗎?」與此類似,「這個英語單詞序列(帶標點符號)是否構成完整的句子?」


C要求在編譯程序時可以找到的錯誤。 D要求在編譯成功後運行程序時看到的錯誤。你現在應該能夠區分這兩個希望。

我希望這可以幫助您更好地理解並使這些答案更容易。