3주 강의 Lexical Elements, Operators, and the C System Chapter 2 3주 강의 Lexical Elements, Operators, and the C System
Compiler Grammar ::: lexical, syntax, semantics, pragmatics Compiler checks the legality of C code Preprocessor compiler Error recovery
Lexical Terms Token의 종류 (ANSI C) : keywords, identifiers, constants, string constants, operators, punctuators Lexical errors
Characters and Lexical Elements Lowercase letters, uppercase letters, digits, other characters (+, -, …), white space characters (blank, newline, tab) Lexical errors int a, b, c; inta, b, c &a, &b == & a , & b sum=a+b; == sum = a +b; s u m = a +b;
Syntax Rules Digit ::= 0|1|2|3 |4|5|6|7|8|9 BNF(Bacus Naur Form) ::= (rewriting), | (separate), * [] (optional), {} (0 or more), * {}1, {}0+, {}1+, {}opt conditional_statement :: if (expression) statement {else statement}opt
명칭(identifier) identifier ::= {letter | _}1 {letter | digit | _}0+ 숙제 ::: constant(실수, 정수), string을 위한 문법(BNF)을 참고로 2.74, 36, 2.7e-04, “I love you.”가 바름을 보여라. (constant나 string임) Appendix B를 참고하여 설명 !!!!
Comments /* This is comments */ // This is comments Self-documentation
Keywords Auto, do, goto, signed … (page 77) Reserved word와 그렇지 않은 word의 차이점 Keyword가 reserved된 언어와 그렇지 않은 언어
Constants, String constants, Operators, Punctuator Constants : 0, 17, 3,14159, ‘a’, ‘+’, “\n”, enumeration type String constants : “I”, “a string”, “ “, “c=a+b”, “\\ I \\” “abc” “def” “abcdef” ??? /* “ This is a string” */, “ ” Operators : +, -, *, /, % ??? a-b, a_b Punctuators : “{“, “,”, “;”, “(“, “)” ??? main(void) ++a, a+=b 질문 :::: ‘=‘은 어디에 속하나 ???
Precedence and Associativity of Operators *** Page 332에 전체 테이블 Operator precedence and associativity Operator Associativity () ++(postfix) --(postfix) left to right +(unary), -(unary), ++(prefix), --(prefix) right to left * / % + - = += -= *= /=
Increment and decrement Operators ++val, val++ :: val=val+1 속도에서 빠르다 … 이유? 차이 :: (1) a=1; b=++a; printf(“%d,%d”,a,b) (2) a=1; b=a++; printf(“%d,%d”,a,b) Side-effect
Assignment Operators a=b+c; /* ‘=‘의 우선순위는 어떤 연산자보다 낮으면서 오른쪽 우선 */ variable=right_side a= (b=2) + (c=3); b=2; c=3; a=b+c; /* 속도 차이 */ a=b=c=0; k=k+2 k+=2; =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= /* 조심 … ‘>=‘, ‘<=‘와 구별 */ i += j+k i += (j+k) i=i+j+k i=(i+(j+k))
The C System The preprocessor #include <stdio.h> #include <stdio.h> /* int rand(void)가 있음 */ random을 이용한 프로그램 seed number srand(time(NULL))
강의 시간에 풀 문제 2장 5,7,8,9를 합하여 하나의 프로그램으로 작성한다 10을 검증한다. 20번을 해결한다. 29를 해결한다 /* 각자 어디까지 해결하는지 검증… 단, 아직은 성적에 반영하지 않고 해결 못한 사람은 집에서 해온다 */
집에서 풀 문제 10, 15,17,18, 23, 25 27 (이 문제는 여러 명이 상의해서 풀어도 된다)