2013-07-29 191 views

回答

113

語法大約是結構或語言的語法。它回答了這個問題:我如何構建一個有效的句子?所有語言,甚至英語和其他人類(又稱「自然」)語言都有語法,即定義句子是否正確構建的規則。

下面是一些C語言的語法規則:

  • 用分號
  • 圍成一個IF語句的條件表達式括號內
  • 組多個語句成單個語句通過封入單獨的語句在大括號中
  • 數據類型和變量必須在第一個可執行語句之前聲明(此功能已在C99.C99中刪除,而後者允許混合類型聲明)

語義是關於句子的含義。它回答了這個問題:這句話有效嗎?如果是這樣,那麼這個句子意味着什麼?例如:

x++;     // increment 
foo(xyz, --b, &qrs); // call foo 

是句法上有效的C語句。但他們是什麼意思?嘗試將這些語句轉換爲可執行的指令序列甚至有效嗎?這些問題是語義學的核心。

考慮第一條語句中的++運算符。首先,這是否是有效的嘗試?

  • 如果x是一個浮點數據類型,這種說法是沒有意義的(根據C語言的規則),因此它是一個錯誤即使該語句是語法正確的。
  • 如果x是一個指針,指向一些數據類型,語句的意思是「到值在地址x在地址x加的sizeof(一些數據類型)並將結果存儲到位置」。
  • 如果x是一個標量,則語句的含義是「將地址x中的值加1並將結果存儲到地址x處的地址」。

最後,請注意,某些語義無法在編譯時確定,因此必須在運行時進行評估。在++運算符的例子中,如果x已經處於其數據類型的最大值,當你嘗試給它加1時會發生什麼?另一個例子:如果你的程序試圖取消引用其值爲NULL的指針,會發生什麼?

總之,語法只關注自身是否該語句對該語言的語法有效。語義是關於句子是否具有有效含義。

+0

好的。如果'x'處於其數據的最大值並且向其添加了'1',則會導致一些奇怪的輸出('0'),這不是語義錯誤嗎? – haccks

+0

考慮車輛里程錶 - 它有一系列相互關聯的輪子,每個輪子上印有數字0到9。最右邊的輪子旋轉最快;當它從9迴歸到零時,其左側的車輪前進一個。當此輪從9前進到0時,其左側前進,依此類推。 –

+0

這是什麼意思? – haccks

6

語義是您的代碼意味着什麼 - 您可能會在僞代碼中描述。語法是實際結構 - 從變量名到分號的所有內容。

+4

http://c2.com/cgi/wiki?SyntaxVsSemantics – thumbtackthief

9

語法指的是一種語言的結構,追蹤它的etymology如何結合在一起。
例如,您可能需要通過聲明類型,名稱和分號來將代碼放在一起,以便在語法上正確。

Type token; 

另一方面,語義是關於意義。 編譯器或解釋器可能會抱怨語法錯誤。你的同事會抱怨語義。

+0

是邏輯的語義同義嗎? –

+0

@Talespin_Kit含義而不是結構:邏輯更像是一種抽象,例如P => Q等等或者!! P = P,但是當你添加語義時,事物可以有微妙的含義,如果P是「開心」,那麼!! P是「我不開心」!=「我是快樂「 – doctorlove

+1

+1」編譯器或解釋器可能會抱怨語法錯誤,您的同事會抱怨語義。「 – JagsVG

5

維基百科有答案。閱讀syntax (programming languages) & semantics (computer science) wikipages。

或想想任何compiler或​​的工作。第一步是lexical analysis,其中令牌是通過將字符串分割成詞位然後parsing生成的,其構建一些abstract syntax tree(這是語法的表示)。接下來的步驟涉及轉換或評估這些AST(語義)。

另外,注意觀察,如果你定義的C的變體,每一個關鍵字轉化成它相當於法國(所以if成爲sido成爲faireelse成爲sinon等等等等......),你肯定會改變的語法你的語言,但你不會改變太多的語義:法語-C編程不會更容易!

0

語法:它指語言的語法結構。如果您正在編寫c語言。你必須非常小心地使用數據類型,標記[它可以是文字或符號,如「printf()」。它有3個tokes,「printf,(,)」]。同樣,你必須非常小心,你如何使用函數,函數語法,函數聲明,定義,初始化和調用它。

雖然語義,它關係到邏輯或句子或語句的概念。如果你用概念或邏輯說出或寫出某些東西。那麼,你的語義錯誤。

1

語法是表達式,語句和程序單元,但語義的結構或形式是那些表達式,語句和程序單元的含義。 語義直接從語法語法是指特定編程語言指定的代碼的結構/形式,但是語義涉及分配給符號,字符和單詞的含義。