Syntax and Semantics ธนวัฒน์ แซ่เอียบ
Introduction ภาษาจำเป็นต้องอธิบายให้กับผู้คนจำนวนมากสามารถเข้าใจคำอธิบายที่ภาษานั้นจัดเตรียมไว้ให้ ALGOL 60 และ ALGOL 68 เป็นภาษาแรกที่ใช้รูปแบบที่สั้นกระชับในการอธิบายรูปแบบภาษา จากคำอธิบายเหล่านี้จะต่อช่วยให้โปรแกรมเมอร์สามารถนำไปเขียน expressions statements และโครงสร้างของโปรแกรมทั้งหมดได้ รวมทั้งผลกระทบที่เกิดขึ้นเมื่อโปรแกรมปฏิบัติงาน การเรียนภาษาที่ใช้ในการเขียนโปรแกรม เหมือนกับการเรียนภาษาตามธรรมชาติ สามารถแบ่งออกได้ 2 ส่วนคือ syntax และ semantics
Syntax Syntax คือรูปแบบของ expressions statement และ program units ไวยกรณ์ของภาษาบอกได้ 2 สิ่งคือ อะไรคือส่วนที่ถูกต้อง อะไรคือความสัมพันธ์ระหว่างส่วนที่ถูกต้อง ตัวอย่าง if statement ของภาษา C if (i>0) printf(“Finish”);
Syntax The lowest level syntactic units are called lexemes The description of lexemes can be given by a lexical specification Lexemes include its identifiers, literals, operators, and special words if (i>0) sum = sum + 4;
Syntax A token of a language is a category of its lexemes An identifier is a token that can have lexemes or instance, such as sum and total In some cases, a token has only a single possible lexemes plus_op, the token for the arithmetic operator symbol +, has just one possible lexemes
Syntax พิจารณา statement ของภาษา C ดังต่อไปนี้ Index = 2 * count + 17; Q. Lexemes มีอะไรบ้างและแต่ละ lexemes คือ tokens อะไร (tokens มีดังต่อไปนี้ equal_sign, mult_op, semicolon, int_literal, identifier, plus_op) Lexemes Tokens
Syntax Syntax informally Example: “Everything between “/*” and “+/” is a comment and should be ignored.” Code: /*Store the result in y.*/ x = 3; */ y = x * 17.2; => Syntax formally
Semantics Semantics คือความหมายของ expressions statement และ program units เหล่านี้
Syntax Formally กลไกที่ใช้อธิบายไวยกรณ์ของภาษาที่ใช้ในการเขียนโปรแกรมเรียกว่า grammars Fundamentals A metalanguage คือภาษาซึ่งใช้อธิบายภาษาอื่นเช่น BNF BNF ใช้ abstractions ในโครงสร้างของไวยกรณ์ เช่น assignment statement ของภาษา C ใช้ abstraction คือ <assign> กำหนดได้จาก <assign> -> <var> = <expression>
BNF สัญลักษณ์ทางซ้ายของลูกศรเรียกว่า left-hand side (LHS) คือ abstraction ที่จะนำมานิยาม ข้อความทางขวามือเรียกว่า right-hand side (RHS) ประกอบด้วยการผสมระหว่าง tokens, lexemes, การอ้างถึง abstraction อื่น ทั้งหมดนี้เรียกว่า rule หรือ production (ซึ่ง <var> และ <expression> ต้องนิยามเพื่อทำให้ <assign> สมบูรณ์)
BNF Abstraction สามารถมีรูปแบบไวยากรณ์ได้มากกว่าหนึ่งรูปแบบ การนิยามหลายๆการนิยามสามารถเขียนได้โดยใช้สัญลักษณ์ | ตัวอย่าง if statement ของภาษา Pascal สามารถเขียนได้ดังนี้ <if_stmt> -> if <logic_expr> then <stmt> <if_stmt> -> if <logic_expr> then <stmt> else <stmt> หรือเขียนด้วยรูปแบบ | if <logic_expr> then <stmt> else <stmt>
BNF รายการที่มีความยาวไม่คงที่ทางคณิตศาสตร์สามารถเขียนโดยใช้ ellipsis (…) เช่น 1, 2, … BNF ไม่สามารถมี ellipsis ทางเลือกคือการใช้ recursion แทน <ident_list> -> identifier | identifier , <ident_list> นิยาม <ident_list> เป็นไปได้ทั้ง identifier ตัวเดียว หรือ identifier ตามด้วย comma และตามด้วย <ident_list> อื่นๆ ถ้านิยาม identifier -> 1 | 2 | 3 แล้ว <ident_list> จะเป็นรายการใดได้บ้าง
BNF BNF คือเครื่องมือสำหรับใช้นิยามภาษา สามารถนำกฎต่างๆที่มีมาใช้สร้างเป็น sentences กระบวนการสร้าง sentence เรียกว่า derivation Grammar ของภาษาส่วนใหม่เริ่มต้นด้วยการนิยาม <program> เป็นอันดับแรก
Exercise Grammar ของภาษาหนึ่ง <program> -> begin <stmt_list> end <stmt_list> -> <stmt> | <stmt> ; <stmt_list> <stmt> -> <var> = <expression> <var> -> A | B | C <expression> -> <var> + <var> | <var> - <var> | <var> ให้เขียนตัวอย่าง derivation จาก grammar ที่กำหนดให้
Exercise Grammar ของ Assignment Statement <assign> -> <id> = <expr> <id> -> A | B | C <expr> -> <id> + <expr> | <id> * <expr> | ( <expr> ) | <id> ให้เขียน derivation เพื่อให้ได้ statement ดังต่อไปนี้ A = B * ( A+C)
ที่มา Concepts of programming languages : Sebesta, Robert W.