(3) Windows 운영체제에 GNU C 컴파일러와 Flex, Bison 설치하기 적용된 Windows 운영체제는 32비트용 Windows 7이나, 다른버전에서도유사할것으로본다. 먼저 GNU C 컴파일러를설치한다. 이것을설치하는편한방법중하나가유명한무료 C/C++ 프로

Size: px
Start display at page:

Download "(3) Windows 운영체제에 GNU C 컴파일러와 Flex, Bison 설치하기 적용된 Windows 운영체제는 32비트용 Windows 7이나, 다른버전에서도유사할것으로본다. 먼저 GNU C 컴파일러를설치한다. 이것을설치하는편한방법중하나가유명한무료 C/C++ 프로"

Transcription

1 컴파일러구성을위한대표적소프트웨어도구인 Lex( 또는 Flex) 와 Yacc( 또는 Bison) 입문 : Windows 환경에서 김도형 ( 성신여자대학교 IT 학부 ) 0. 소개 (1) Lex 와 Yacc 은무엇인가? 컴파일러의구성을도와주는대표적인소프트웨어도구들이다. 원래 UNIX의산실인벨연구소 (AT&T Bell Laboratories) 에서 UNIX 시스템의유틸리티 (utility) 로서개발되었다. 각각의개발자는 Lex는 Mark Lesk, Yacc은 Steve Johnson이다. 이후이도구들의유용성이확인되면서 Sun의 Solaris나 Linux와같은 UNIX 계열의운영체제는물론이고, Microsoft Windows 등의상이한운영체제에도이식 (porting) 되어서널리사용되고있다. (2) Lex 와 Yacc 을어떻게구하는가? 현재 UNIX 계열상용 ( 商用 ) 운영체제의경우 Lex와 Yacc은기본유틸리티의일부로서포함되어있다. 그러나 Lex와 Yacc의판권 (copyright) 은 Bell Laboratories( 현재 Lucent Technology) 가가지고있으므로, Linux와같은 FSF(Free Software Foundation) 의정신을표방하는운영체제의경우는각각 Lex와 Yacc의 GNU 버전 (version) 인 Flex와 Bison을기본유틸리티로서갖추고있다. 그외도여러운영체제를위한약간씩다른 Lex와 Yacc의버전들이있다. Windows 상에서 Cygwin 시스템을사용한다면처음설치할때 Flex와 Bison을선택하여사용하는것이가장 UNIX 계열운영체제와유사하게사용할수있을것이다. 이밖에도 Windows 환경에서 Lex와 Yacc 또는그에상응하는유틸리티를이용하기위한몇가지다른방법이있다. 원래의 Lex나 Yacc과는달리결과파일을 C 언어뿐만아니라 C++ 언어나 Java 언어로출력하는상용소프트웨어도시판되고있다. 또한 Cygwin 시스템과같이 UNIX 계열운영체제와유사한환경전체의설치가필요없는경우, GNU C 컴파일러 (gcc) 와 Flex, Bison만 Windows 운영체제에설치하여사용할수도있다. 이 Windows 운영체제용튜토리얼 (tutorial) 에서는가장간단한마지막방법에기반을두어설명하도록하겠다. ( 추후 Windows 운영체제를위한다른방법에대한내용을추가할계획이다.) - 1 -

2 (3) Windows 운영체제에 GNU C 컴파일러와 Flex, Bison 설치하기 적용된 Windows 운영체제는 32비트용 Windows 7이나, 다른버전에서도유사할것으로본다. 먼저 GNU C 컴파일러를설치한다. 이것을설치하는편한방법중하나가유명한무료 C/C++ 프로그램용통합개발환경 (IDE integrated development environment) 인 Bloodshed 사의 Dev-C++ 를설치하는것이다 ( 관련사이트링크 : 원래 Dev-C++ 가 GNU C 컴파일러를기본으로하여그위에사용자편의를위한 IDE 인터페이스를뒤집어씌운것이기때문이다. Dev-C++ 를설치하면 ( 주의 : 이것이설치되는폴더 (folder) 까지이르는경로명 (path name) 에공백이없도록한다. 보통 C:\Dev-Cpp 에설치한다 ) 그설치디렉터리 (directory) 아래 bin 이라는하위디렉터리가만들어지고이안에 GNU C 컴파일러 ( gcc.exe ) 와 C++ 컴파일러 ( g++.exe ) 가설치된다. 그다음에는 Flex와 Bison을설치한다. ( 비록이렇게서술하지만이세프로그램 (GNU C 컴파일러, Flex, Bison) 의설치순서는바뀌어도상관없다.) Flex를다운로드받는다 ( 관련사이트링크 : 설치는매우간단하여다운로드받은설치파일을실행시킨후몇번 동의 또는 다음 버튼을누르기만하면된다 ( 주의 : Dev-C++ 와마찬가지로이것이설치되는폴더까지이르는경로명에공백이없도록한다. 보통 C:\GnuWin32 에설치한다 ). Bison도다운로드받아서 ( 관련사이트링크 : Flex 와같은요령으로설치한다 ( 주의 : 앞의두프로그램과마찬가지로이것이설치되는폴더까지이르는경로명에공백이없도록한다. 경로명에공백이있는경우실제 Bison을사용할때오류가발생하는것을확인했으니특히주의해야한다. 보통 Flex와함께 C:\GnuWin32 에설치한다 ). 세프로그램의설치를마치면시스템의환경변수들중 PATH 변수의값에 GNU C 컴파일러와 Flex, Bison의실행파일이있는경로를추가한다. 즉, 예컨대 C:\Dev-Cpp\binC:\GnuWin32\bin 을추가내지 ( PATH 변수가없었던경우 ) 새롭게등록하는것이다. 명령프롬프트 (command prompt) 창을연다 ( 모든프로그램 보조프로그램 명령프롬프트 메뉴를선택하여실행하거나실행창에서 cmd(.exe) 를입력하여바로실행시킨다 ). 이창에서 flex --version 을입력하여설치된 Flex의버전을확인한다 ( 최신버전은 2.5.4a). bison --version 을입력하여설치된 Bison의버전을확인한다 ( 최신버전은 2.4.1). gcc --version 을입력하여설치된 GNU C 컴파일러의버전을확인한다 ( 최신버전은 3.4.2이나 Dev-C++ 안정버전에포함된것은 어느것이라도상관없다 ). 설치의마지막으로 Flex와 Bison이필요로하는라이브러리파일을 GNU C 컴파일러가찾을수있도록적절한디렉터리에복사한다. Flex와 Bison이설치된디렉터리 ( 예컨대 C:\GnuWin32 ) 에가면여러하위디렉터리가있는데, 그중 lib 속에 libfl.a 와 liby.a 가포함되어있고이것들이각각 Flex 와 Bison의라이브러리아카이브 (archive) 파일이다. 이것들을 GNU C 컴파일러의라이브러리디렉터리 ( 예컨대 C:\Dev-Cpp\lib ) 에복사한다

3 Flex 와 Bison 을사용하는일반적인형태는다음 C:\Users\JohnDoe> flex test.l C:\Users\JohnDoe> bison test.y 과같다. (Flex 입력파일의이름은 test.l, Bison 입력파일의이름은 test.y 라고가정한다.) 이렇게하면현재작업하는디렉터리에 Flex 와 Bison 의실행결과파일이만들어진다. 보다자세한설 명은뒤에서여러예제를직접보면서할것이다

4 1. Lex(Flex) 와 Yacc(Bison) 의작동 (1) Lex(Flex) 와 Yacc(Bison) 의역할 Lex(Flex) 와 Yacc(Bison) 모두사용자가작성한명세 (specification) 파일을처리하여각각기본적으로 C 언어로작성된어휘분석프로그램 (lexical analyzer 또는 scanner) 과구문분석프로그램 (syntax analyzer 또는 parser) 을만들어낸다 ( 이결과프로그램을 C++ 언어또는 Java로내는확장상용버전도있다 ). 사용자는이결과파일을컴파일하여단독으로, 또는컴파일러나다른용도의더큰프로그램의일부로사용하게된다. 그리중요한점은아니나, 오리지널 Lex와 Yacc 프로그램이결과로만들어내는파일의이름은각각 lex.yy.c' 와 y.tab.c 로고정되어있었다. 그러나 GNU 버전인 Flex와 Bison에서는입력파일의이름뒤에확장자로각각 yy.c 와 tab.c 를붙여서결과파일의이름을정할수있도록수정되었다. 각프로그램의입력으로들어가는명세파일의내용은그목적에비추어보면명백하게예상할수있다. 어휘분석기의경우, 입력으로기호 ( 대개문자 ) 들의스트림 (stream) 을받아그기호들로이루어진스트링 (string) 들의스트림을출력으로내보내므로 ( 이기호스트링을토큰 (token) 이라고도부르고, 이러한이유로 scanner를 tokenizer라고부르기도한다 ), Lex(Flex) 입력명세에는입력스트림으로부터한단위또는토큰으로모아야하는기호들의패턴들이규정되어있어야한다. 구문분석기의경우는기호스트링들의스트림을입력으로받아그스트링들이주어진문법에부합되는지의여부를판단하고부합할때는출력으로그스트링들의파스트리 (parse tree) 또는구문트리 (syntax tree) 를내보낸다 ( 출력은컴퓨터내부에서꼭명시적으로트리형태를가질필요는없으며, 구문분석과정에서묵시적으로구성되어이용될수도있다 ). 따라서 Yacc(Bison) 입력명세에는문법의생성규칙 (production rule) 들이규정되어있어야한다. (2) Lex(Flex) 와 Yacc(Bison) 의입력파일형식의얼개 두프로그램의입력파일모두크게세부분으로구성되어있으며, 각부분의역할도비슷하다. 첫번째부분은선언 (declaration) 이나정의 (definition) 가포함되며, 두번째부분은본론에해당하는것으로서각프로그램이수행하는일에대한규칙 ( 보통번역규칙 (translation rule) 이라고부른다 ) 을기술하고, 세번째부분은보조프로시저 (auxiliary procedure) 또는지원프로그램 (supporting routines) 을담고있다. 이세부분들중꼭있어야하는필수부분은두번째부분이고, 첫번째와세번째부분은필요없는경우생략이가능하다. 각부분은연속된두개의 % 기호로구분된다. 첫번째와세번째부분에대한설명은뒤에예제를통해하기로하고, 가장핵심이되는두번째부분에대해간략하게언급하고자한다

5 Lex(Flex) 의경우이두번째부분은아래 패턴 1 { 동작 1 패턴 2 { 동작 2 패턴 n { 동작 n 와같은형식을가지고있는데, 앞부분의패턴 (pattern) 이입력스트림에서발견되면뒷부분에있는동작 (action) 을실행하라는의미이다. 동작은 C 언어로된문장들로서, 하나의문장이면중괄호 (curly braces) 가필요없다. 패턴은스트링패턴을기술하는데보편적으로사용되는정규표현 (regular expression) 을 Lex에서확장한것을사용한다. Yacc(Bison) 의경우이두번째부분은아래 생성규칙 1 의좌변 : 의미동작이추가된생성규칙 1 의우변생성규칙 2 의좌변 : 의미동작이추가된생성규칙 2 의우변 생성규칙 n 의좌변 : 의미동작이추가된생성규칙 n 의우변 와같은형식을가지고있는데, 생성규칙의우변에있는문법기호 (grammar symbol) 들사이의필요한곳에중괄호에둘러싸인의미동작 (semantic action) 이삽입되어있는형태이다. 즉, 구문-인도번역 (syntax-directed translation) 의한종류인번역방략 (translation scheme) 형태인것이다. 의미동작은 Lex(Flex) 입력파일에서의동작과마찬가지로역시 C 언어로된문장들이다

6 2. 예제들을통한 Lex(Flex) 설명 (1) 첫번째예제 : 파일의줄번호붙이기 버전 1 %{ /* * line numbering 1 */ int lineno = 1 % \n { lineno++ ECHO ^.*$ printf("%d\t%s", lineno, yytext) 예제 1. 파일이름 ln1.l : 공백줄은건너뛰면서줄번호붙이기 먼저, 상기파일의경우 Lex 입력파일형식에서세번째부분이없고첫번째와두번째부분만있는상태이다. 세번째부분이없으므로, 두번째와세번째부분을구분하는두번째 은생략되어있다. 첫번째부분에서 %{ 와 % 에둘러싸인부분을볼수있는데, 이부분은 Lex(Flex) 에의해별다른처리가되지않고내용그대로 (in verbatim) 가결과파일인 lex.yy.c ( 이이름은 Flex의경우 -o 옵션과함께사용자가원하는대로지정하여바꿀수있다 ) 에포함된다 (being dumped). 결과적으로 lineno 란전역 (global) 변수를어휘분석기프로그램에서사용할수있게된다. 이변수는입력파일의줄번호를세는역할을하게된다. 두번째부분에는두개의패턴이규정되어있다. 첫째는 \n 인데, 글자그대로줄바꿈 (new line) 문자만이이패턴에부합한다. 그리고그패턴이입력에서인식되면해야될동작으로는 lineno 변수를 1 증가시키고 ECHO 란이름의매크로 (macro)( 이매크로는 Lex(Flex) 에의해정의되어있는데, 역할은지금패턴에부합한다고인식된토큰을출력하는것이다. 지금경우는그인식된토큰은 \n 이다. 따라서출력에서줄이바뀔것이다 ) 를호출하는것이다. 둘째는 ^.*$ 인데, 여러가지 Lex(Flex) 내의메타-문자 (meta-character) 가사용되고있다. 제일앞의 ^ 은입력파일의한줄에서제일앞을의미한다 ( 그렇지만제일앞에있는특정기호를의미하는것은아니다 ). 마지막에있는 $ 은반대로한줄의제일끝을의미한다 ( 역시제일끝에있는특정기호를의미하는것은아니다 ). 이들중간에있는.* 에서. 은 Lex(Flex) 에서줄바꿈문자를제외한임의의문자를의미한다. 그리고 * 은표준적인정규표현에서의의미그대로, 그앞에있는패턴에부합하는스트링 ( 기호는길이가 1인스트링이므로당연히포함 ) 이아예없든지아니면임의횟수반복될수있음을의미한다 (reflexive transitive closure). 결국이것들을종합하면, 둘째패턴은입력파일에서임의의한줄에서마지막에있는줄바꿈문자를제외한나머지줄전체와부합한다. 그리고그패턴이입력에서인식되면줄번호를담고있는 lineno 변수의값을출력하고이어서 yytext 를출력하는데, yytext - 6 -

7 는 Lex(Flex) 에서토큰을인식하는과정에서그것을임시로저장하는버퍼 (buffer) 로서문자배열 (character array) 이다. 결과적으로패턴에부합된다고인식된토큰을출력하는셈이다. ( 첫째패턴에서본 ECHO 와 printf("%s", yytext) 는동일한결과를만든다. 인식된토큰을출력하는이런일이워낙빈번하게사용되므로, Lex(Flex) 에서그것을위한축약형으로 ECHO 매크로를정의하여제공하는것이다.) 이제상기 Lex(Flex) 입력파일을사용해보도록하자. 다음 C:\Users\JohnDoe> flex ln1.l C:\Users\JohnDoe> gcc -o ln1 lex.yy.c -lfl 과같은순서로실행시킨다 ( 사용한플랫폼은 32비트 Windows 7이고, C:\Users\JohnDoe> 는명령프롬프트 (command prompt) 이다 ). Flex 프로그램을파일 ln1.l 을입력으로하여실행시킨다. 그결과로현재디렉토리 (directory) 에 lex.yy.c 파일이생긴다. 이 C 프로그램파일을컴파일한다. 이때주의할점은 Flex 라이브러리를컴파일할때링크시켜야 ( -lfl ) 무사히컴파일되어실행파일이만들어진다. 이렇게만들어진실행파일에아래 day := (1461*y) div 4 + (153*m+2) div 5 + d if a then c := 1 while (c) do c := c - 1 와같은입력파일 ( 파일이름 data.p. Pascal 프로그래밍언어의구문으로된간단한몇문장을포함 하고있다 ) 을다음 C:\Users\JohnDoe> ln1 < data.p 과같이실행시키면아래 1 day := (1461*y) div 4 + (153*m+2) div 5 + d 3 if a then c := 1 5 while (c) 6 do c := c - 1 와같은결과가나온다. 결과에서보듯이 \n 문자만으로이루어진빈줄에대해서는줄번호가없이 빈줄만출력된다

8 (2) 두번째예제 : 파일의줄번호붙이기 버전 2 Lex(Flex) 입력파일은다음 %{ /* * line numbering 2 */ int lineno = 0 % ^.*\n printf("%d\t%s", ++lineno, yytext) 예제 2. 파일이름 ln2.l : 공백줄을포함하여모든줄에줄번호붙이기 과같다. 예제 1과마찬가지로, Lex(Flex) 입력파일형식에서세번째부분은없는상태이다. 예제 1에서설명한내용만으로도예제 2를이해하는데는어려움이없을것이다. 예제 1에서처럼 Flex를실행시킨뒤만들어진 lex.yy.c 파일을컴파일하여만든실행파일에 data.p 파일을입력으로줘서실행시키면아래 1 day := (1461*y) div 4 + (153*m+2) div 5 + d 2 3 if a then c := while (c) 6 do c := c - 1 와같은결과가나온다. 보다시피모든줄에줄번호가붙여져있다

9 (3) 세번째예제 : 파일의줄수, 단어수, 글자수세기 Lex(Flex) 입력파일은다음 %{ /* * word count */ int nchar, nword, nline % \n ++nchar, ++nline [^ \t\n]+ ++nword, nchar += yyleng. ++nchar int main(void) { yylex() printf("%d\t%d\t%d\n", nchar, nword, nline) return 0 예제 3. 파일이름 wc.l : 입력파일의줄수, 단어수, 글자수세기 과같다. 상기파일의경우 Lex(Flex) 입력파일형식의세부분을모두갖추고있음에유의하자. 먼저첫번째부분을보면, 각각글자수, 단어수, 줄수를저장하기위한세변수 nchar, nword, nline 이선언되어있다. 이선언은주석문과함께 %{, % 사이에위치하므로변경없이고스란히 Lex(Flex) 의결과파일인 lex.yy.c 에전역변수로포함된다. 두번째부분을보면세개의패턴과그에대한동작이규정되어있다. 첫째는 \n 으로서입력파일에포함되어있는줄바꿈문자만이부합한다. 따라서글자수와줄수가 1씩증가한다. 둘째는 [^ \t\n]+ 인데몇가지 Lex(Flex) 의메타-문자들이사용되고있다. 대괄호 ( [ 와 ] ) 는문자클래스 (character class) 를나타낸다. 예컨대패턴 [ab] 는스트링 a 나 b 가부합하고, 패턴 [ \t\n] 은스트링 ( 공백문자로이루어진스트링 ) 이나 \t 이나 \n 이부합한다. Lex(Flex) 에서 ^ 문자는줄의제일앞을나타내기도하나, 대괄호안에서사용되면 후속문자들을제외한다른문자들 이라는의미를가진다. 따라서패턴 [^ \t\n] 은공백문자와탭 (tab) 문자그리고줄바꿈문자를제외한다른임의의문자들이부합한다. 마지막으로 + 는거의표준적인정규표현으로서그앞에있는패턴에부합하는스트링이한번이상임의횟수반복될수있음을의미한다 (positive closure). 결국종합하면둘째패 - 9 -

10 턴은임의문자들로이루어진임의길이스트링 ( 중간에공백문자나탭문자나줄바꿈문자로끊어지지않은 ) 에부합한다. 곧 단어 라고볼수있다. 그러므로단어수를 1 증가시키고글자수는단어의길이만큼증가시켜야한다. 즉지금이패턴에부합된실제스트링의길이만큼 nchar 변수를증가시켜야하는것이다. Lex(Flex) 에서는명시된패턴에부합되어인식한입력스트링의길이를담고있는변수를미리제공하고있는데바로 yyleng 이다. 셋째는. 인데앞에서설명했듯이줄바꿈문자를제외한임의문자가부합하는패턴이다. 첫째패턴과둘째패턴에서부합되지않는입력은이제 와 \t 이다. 따라서글자수만 1 증가시켜주면된다. 세번째부분을보면 main 함수가정의되어있다. 우리가 Lex(Flex) 로부터만들어진 lex.yy.c 파일을열어보면어휘분석을담당하는함수로 yylex 가만들어져있다. C 프로그램실행에필수인 main 함수역시정의되어있는데, 이기본 (default) main 함수가하는일은단순히 yylex 함수를호출하는것이전부다. 이 yylex 함수가실행되면서입력의글자수, 단어수, 줄수등을두번째부분에서지시된대로계산할터이나, 기본 main 함수는그결과를출력조차하지않는다. 따라서이출력기능을추가한 main 함수를사용자가새롭게정의해야한다. 세번째부분의 main 함수는그역할을하는것이다. 이렇게사용자가정의한 main 함수가제공되는경우자동적으로 Lex(Flex) 의기본 main 함수는가려진다. 예제 1과 2에서처럼 Lex(Flex) 를실행시킨뒤만들어진 lex.yy.c 파일을컴파일하여만든실행파일에 data.p 파일을입력으로줘서실행시키면아래 와같은결과가나온다. ( 실습플랫폼이 UNIX 계열이라면, 이것이제대로된결과인지를확인하기위해굳이 data.p 파일의글자수, 단어수, 줄수를셀필요는없다. UNIX 시스템의기본명령중에 wc 가있는데이것이바로입력의글자수, 단어수, 줄수를세는기능을가지고있다. 물론 Linux 시스템에서도기본적으로지원된다. 이명령에인자로 data.p 파일을주고실행시키면결과는다음 $ wc data.p data.p 과같다. 보다시피글자수, 단어수, 줄수의순서만바뀌었을뿐동일한결과를보여주고있다.)

11 3. 예제들을통한 Yacc(Bison) 설명 (1) 첫번째예제 : 중위 (infix) 수식을후위 (postfix) 수식으로변환 버전 1 Yacc(Bison) 입력파일은다음 %{ #include <stdio.h> #include <ctype.h> % %token DIGIT line : expr '\n' { putchar('\n') expr : expr '+' term { putchar('+') expr '-' term { putchar('-') term term : DIGIT { printf("%d", yylval) int yylex() { int c while (1) { c = getchar() if (c == ' ' c == '\t') else if (isdigit(c)) { yylval = c - '0' return DIGIT else return c int main() { if (yyparse() == 0) printf(" 파싱성공!\n\n") else printf(" 파싱실패!\n\n") 예제 4. 파일이름 in2po-rec1.y : 단자리숫자로이루어진중위수식을후위수식으로변환

12 과같다. 이파일에는세부분이모두있다. 하나씩살펴보자. 첫번째부분에서 %{ 와 % 에둘러싸인부분은 Lex(Flex) 에서와마찬가지로 Yacc(Bison) 이변경하지않고그대로결과파일인 y.tab.c ( 오리지널 Yacc의경우 ) 에포함시킨다. 결과적으로 Yacc(Bison) 이만든파서프로그램에서 C 언어의표준헤더파일인 <ctype.h> 를포함시키는효과를내고그결과다양한문자판별술어함수 (predicate) 를사용할수있게된다. 첫번째부분의나머지에는 Yacc(Bison) 의키워드 (keyword) %token 을사용한선언이하나있는데, 두번째부분에서사용되는 DIGIT 이란기호가단말 (terminal) 기호란표시이다. 기본적으로 Yacc(Bison) 은두번째부분에서사용되는모든식별자 (identifier) 를비단말 (nonterminal) 기호라고간주한다. 단말기호로 Yacc(Bison) 이인식하게하려면, 홑따옴표 (single quote) 에둘러싸인문자이거나 Yacc 입력파일첫번째부분에서 %token 을사용해단말기호라고선언해야한다. 두번째부분에는단자리숫자들이 + 와 로엮어진중위수식을표현하기위한문법이기술되어있고, 거기에그중위수식을후위수식으로변환하기위한의미동작이추가되어있다. 곧번역방략이나와있다는뜻이다. 이번역방략의내용은자명하기에 ( 교재에서학습하기도한내용이라 ) 설명은생략하고, 문법의마지막생성규칙에추가된의미동작에서사용되고있는변수 yylval 에대해서만언급한다. 이변수는 Yacc(Bison) 에서미리정의되어있는데, 어휘분석기에서인식한토큰을 Yacc(Bison) 에의해만들어진파서쪽으로반환할때추가로반환할속성 (attribute) 값이있는경우그것을저장하여전달하는데사용된다. 주로 Yacc(Bison) 과 Lex(Flex) 를연동하여사용할때 Lex(Flex) 에서만든어휘분석기가토큰을인식하면서원하는값을저장한뒤 Yacc(Bison) 에서만들어진파서쪽으로복귀하는식으로이용되는게일반적이다. 세번째부분에는 main 함수와어휘분석기함수 yylex 가포함되어있다. Yacc(Bison) 에서만들어진파서함수 ( 이름은 yyparse 로고정되어있다 ) 는파싱과정에서필요할때마다어휘분석기에게토큰을요구하는데, 어휘분석기함수의이름이 yylex 라고무조건생각한다. 따라서 Lex(Flex) 를이용하여어휘분석기를만드는경우에는만들어진어휘분석기함수이름이저절로 yylex 로고정되어있으므로신경쓸필요없으나, 이예제처럼수동으로어휘분석기를만드는경우에도어휘분석기함수이름은무조건 yylex 로붙여야한다. 여기서수동으로작성된어휘분석기함수 yylex 의내용을보면, 공백문자와탭문자는그냥지나가고숫자는단자리로끊어서 DIGIT 이란토큰으로인식한다. 이 DIGIT 토큰의토큰값은자동으로 Yacc(Bison) 에의해정의되므로사용자는그냥 DIGIT 을반환하면 Yacc(Bison) 에서만들어진구문분석기가알아본다. 단자리숫자로이루어진 DIGIT 토큰의경우, 그단자리숫자의실제정수값을구해서토큰의추가속성값을저장하는변수 yylval 에넣은뒤아울러파서쪽으로복귀한다. 그외 + 나 - 나 \n 과같은한글자토큰은각문자의코드 ( 예컨대 ASCII) 값을토큰값으로반환하게된다. main 함수는파서함수인 yyparse 를호출하는것이주된임무이다. 호출된 yyparse 함수는필요할때마다 yylex 함수를불러토큰을받아파싱을진행한다. 입력에대해성공적으로파싱이완료되면 yyparse 함수는 0을반환한다. 이제상기 Yacc(Bison) 입력파일을사용해보자. 다음 C:\Users\JohnDoe> bison -y in2po-rec1.y C:\Users\JohnDoe> gcc -o in2po-rec1 y.tab.c -ly

13 과같은순서로실행시킨다. Bison 프로그램을파일 in2po-rec1.y 를입력으로하여실행시킨다. 옵션 -y 는 Bison을오리지널 Yacc과같은모드 (mode) 로실행하라는뜻이다. 그결과로현재디렉토리에 y.tab.c 파일이생긴다. 이 C 프로그램파일을컴파일한다. 이때주의할점은 Yacc(Bison) 라이브러리를컴파일할때링크시켜야 ( -ly ) 무사히컴파일되어실행파일이만들어진다. 이렇게만들어진실행파일을다음 C:\Users\JohnDoe> in2po-rec 파싱성공! 과같이사용한다. 보다시피단자리숫자를피연산자로하는중위수식을동일한의미의후위수식으로 변환한다 ( 출력할때피연산자들사이에공백을주지않아서붙어나오는바람에보기는다소불편하다 )

14 (2) 두번째예제 : 중위수식을후위수식으로변환 버전 2 첫번째예제에서한것과동일한일을 Lex(Flex) 와 Bison 을함께사용하여하고자한다. 먼저 Bison 입력파일은다음 %{ #include <stdio.h> #include <ctype.h> % %token DIGIT line : expr '\n' { putchar('\n') expr : expr '+' term { putchar('+') expr '-' term { putchar('-') term term : DIGIT { printf("%d", yylval) int main() { if (yyparse() == 0) printf(" 파싱성공!\n\n") else printf(" 파싱실패!\n\n") 예제 5. 파일이름 in2po-rec2.y : 단자리숫자로이루어진중위수식을후위수식으로변환 과같다. 보다시피동일한일을하는첫번째예제에서의 Yacc(Bison) 입력파일과거의동일하다. 다만 이제어휘분석기는 Lex(Flex) 에의해만들어질것이므로, 직접작성했던어휘분석기함수 yylex 부 분이삭제되었다

15 Lex(Flex) 입력파일은다음 %{ #include "in2po-rec2.tab.h" % [ \t]+ [0-9] { yylval = yytext[0] - '0' return DIGIT [+\-\n] return yytext[0] 예제 6. 파일이름 in2po-rec2.l : 단자리숫자로이루어진중위수식을후위수식으로변환 과같다. 세부분들중세번째부분은없는구조이다. 첫번째부분을보면 Lex(Flex) 의결과파일인 lex.yy.c 에그대로포함되는부분이있는데 in2po-rec2.tab.h 라는이름의헤더파일을포함시키는문장이다. 이파일은 Bison에의해만들어지는데 ( 뒤에서추가설명한다 ), Bison에의해정의된토큰의값이나타입을포함하고있다. 예를들면 Bison 입력파일에서비단말기호가아니라단말기호, 즉토큰으로선언된 DIGIT 의토큰값은 Bison 이자동으로배당하는데, 그정의가이파일에포함되어있는것이다. 이파일에서그정의가나오는근처부분을보면아래 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { DIGIT = 258 #endif 와같다. 보다시피 258 의값을가지는기호상수로정의되어있다. 이헤더파일을 Lex(Flex) 의결과파 일인 lex.yy.c 가포함시켜야 Lex(Flex) 입력파일의두번째부분에있는동작에서 DIGIT 을토큰 값으로사용할수있는것이다. 음 참고로 Bison 이아닌 Yacc 을동일입력파일에대해실행시켜만들어지는 y.tab.h 파일을보면다 #ifndef _yacc_defines_h_ #define _yacc_defines_h_ #define DIGIT 257 #define YYERRCODE 256 #endif

16 과같다. Bison에비하면상당히간략하지만, 역시토큰 DIGIT 은 257의값을가지는기호상수로정의되어있다. 두번째부분은대부분이미설명된내용만으로이해에어려움이없겠지만, 셋째패턴에새롭게나타난 Lex(Flex) 의메타-문자가있다. \ 가그것인데, 이것은그바로뒤에나오는문자가 Lex(Flex) 의메타- 문자이면그의미를상실하고문자자체를나타내도록하는효과가있다. 즉, 일반적인 UNIX/C 커뮤니티의관례인이스케이프 (escape) 문자로서의백슬래쉬 (backslash) 의미그대로사용된다. 그러면왜 앞에백슬래쉬를썼는가하는점에설명이필요한데, 가문자클래스를나타내는대괄호사이에있으면문자들의범위 (range) 를뜻하는메타-문자로기능하기때문이다. 예컨대 [abcde] 와 [a e] 는동일한패턴을나타내는것이다. 이제이두 Lex(Flex) 입력파일과 Bison 입력파일을사용해보도록하자. 다음 C:\Users\JohnDoe> flex in2po-rec2.l C:\Users\JohnDoe> bison -d in2po-rec2.y C:\Users\JohnDoe> gcc -o in2po-rec2 lex.yy.c in2po-rec2.tab.c -lfl -ly 과같은순서로명령을실행하여실행파일을만든다. Lex(Flex) 를실행함으로써어휘분석기 yylex 를포함하고있는 lex.yy.c 파일이만들어진다. Yacc과 Bison은거의비슷하나, 만들어지는파일이름이차이가난다. Yacc은실행결과 y.tab.c 를만드나, Bison은실행결과파일이름이 Bison 입력파일의확장자앞부분 에확장자로 'tab.c 를붙여서만든것이된다. 예를들어 Bison 입력파일이름이이예제에서처럼 in2po-rec2.y 라고하면결과파일이름은 in2po-rec2.tab.c 가되는식이다. 또앞서말한 Yacc(Bison) 의정의를포함하고있는헤더파일은기본적으로만들어지는것이아니라, Yacc(Bison) 을실행시킬때 d 옵션 (option) 을줘야한다. 이옵션을가지고실행되면 y.tab.c (Yacc의경우 ) 나 in2po-rec2.tab.c (Bison의경우 ) 뿐만아니라, y.tab.h (Yacc의경우 ) 나 in2po-rec2.tab.h (Bison의경우 ) 도함께만들어낸다. 이헤더파일은우리 Lex(Flex) 입력파일에서규정된것처럼 lex.yy.c 에포함될것이다. 이렇게만들어진실행파일을다음 C:\Users\JohnDoe> in2po-rec 파싱성공! 과같이사용한다. 보다시피단자리숫자를피연산자로하는중위수식을동일한의미의후위수식으로 변환한다

17 (3) 세번째예제 : 간단한단자리수계산기 단자리숫자들을피연산자로하고더하기와빼기만연산자로허용되는중위수식을받아들여그식의 결과값을계산하는계산기프로그램을 Yacc(Bison) 을이용해만들고자한다. Yacc(Bison) 입력파일은 다음 %{ #include <stdio.h> #include <ctype.h> % %token DIGIT line : expr '\n' { printf("%d\n", $1) expr : expr '+' term { $$ = $1 + $3 expr '-' term { $$ = $1 - $3 term term : DIGIT { $$ = $1 int yylex() { int c while (1) { c = getchar() if (c == ' ' c == '\t') else if (isdigit(c)) { yylval = c - '0' return DIGIT else return c int main() { if (yyparse() == 0) printf(" 파싱성공!\n\n") else printf(" 파싱실패!\n\n") 예제 7. 파일이름 calc1.y : 단자리숫자로이루어진중위수식의값을계산

18 과같다. 일단큰뼈대는예제 4 표에있는 Yacc(Bison) 입력파일과동일하다. 단지두번째부분에포함된의미동작들이다를뿐이다. 여기에서 $$ 또는 $1 이나 $2 등과같은표현이사용되고있는데이것은생성규칙에나타나는문법기호에첨부된속성값을나타낸다. $$ 는생성규칙의좌변에있는비단말기호에부착된속성값, $i (i = 1, 2, ) 는생성규칙의우변에있는 i-번째문법기호에부착된속성값을나타내는방식이다. 이표현을이용하면파싱이진행되면서문법기호들의속성값을사용한다양한응용이가능하다. Yacc(Bison) 은상향식 (bottom-up) 파싱알고리즘인 LALR(Lookahead LR) 기법을사용한다. 그러므로제일처음어휘분석단계에서인식된토큰에대해 yylval 변수를통해초기속성값을부여한다. 파스트리의잎노드 (leaf node) 에부착된속성값은이 $-표현을이용해서파스트리의중간노드 (interior node) 나루트노드 (root node) 까지전달될수있다. 이것만이해하면상기 Yacc(Bison) 입력파일을이해하는데는문제가없을것이다. 이제상기 Yacc(Bison) 입력파일을사용해보자. 다음 C:\Users\JohnDoe> bison -y calc1.y C:\Users\JohnDoe> gcc -o calc1 y.tab.c -ly 과같은순서로실행시켜실행파일을만든다. 이렇게만들어진실행파일을다음 C:\Users\JohnDoe>./calc 파싱성공! 과같이사용한다. 이계산기에더하기와빼기이외에곱하기와나누기를연산기능에추가하거나, 연산의우선순위를바꿀수있는괄호를추가하는일은매우간단하다. 곱하기와나누기, 괄호를문법에반영하여번역방략을기계적으로확장하기만하면되기때문이다. Yacc(Bison) 입력파일은다음

19 %{ #include <stdio.h> #include <ctype.h> % %token DIGIT line : expr '\n' { printf("%d\n", $1) expr : expr '+' term { $$ = $1 + $3 expr '-' term { $$ = $1 - $3 term term : term '*' factor { $$ = $1 * $3 term '/' factor { $$ = $1 / $3 factor factor : '(' expr ')' { $$ = $2 DIGIT { $$ = $1 int yylex() { int c while (1) { c = getchar() if (c == ' ' c == '\t') else if (isdigit(c)) { yylval = c - '0' return DIGIT else return c int main() { if (yyparse() == 0) printf(" 파싱성공!\n\n") else printf(" 파싱실패!\n\n") 예제 8. 파일이름 calc2.y : 단자리숫자로이루어진중위수식의값을계산 ( 연산자추가 ) 과같다. 이제상기 Yacc(Bison) 입력파일을사용해보자. 다음

20 C:\Users\JohnDoe> bison -y calc2.y C:\Users\JohnDoe> gcc -o calc2 y.tab.c -ly 과같은순서로실행시켜실행파일을만든다. 이렇게만들어진실행파일을다음 C:\Users\JohnDoe>./calc2 (9 5) * 2 8 파싱성공! 과같이사용한다. 추가로, 한자리수가아닌여러자리로된수를피연산자로허용하도록기능을확장하는일도간단 하다. 상기 Yacc(Bison) 입력파일에서어휘분석을담당하고있는 yylex 함수만다음 int yylex() { int c while (1) { c = getchar() if (c == ' ' c == '\t') else if (isdigit(c)) { yylval = c - '0' c = getchar() while (isdigit(c)) { yylval = yylval * 10 + c - '0' c = getchar() ungetc(c, stdin) return DIGIT else return c 과같이변경하면된다. 그리고프로그램의실행에는아무차이가없으나, 이제는피연산자가한자리수가아니라여러자리수이므로피연산자를나타내는토큰의이름을 DIGIT으로부터 NUMBER로바꾸면보기에한결나을것이다. 여기에서한걸음더나아가, 우리가이미 Lex(Flex) 의사용법을알고있는이상굳이수동으로어휘분석기를만들필요가없다는생각이든다. 즉, 상기 Yacc(Bison) 입력의세번째부분에있는 yylex 함수를삭제하고동일한일을하는 Lex(Flex) 입력파일을만들수있겠다는것이다. Lex(Flex) 입력파일은다음

21 %{ #include <stdlib.h> #include "calc3.tab.h" % [ \t]+ [0-9]+ { yylval = atoi(yytext) return NUMBER [+\-\*\/\(\)\n] return yytext[0] 예제 9. 파일이름 calc3.l : 여러자리숫자로이루어진중위수식의값을계산 과같고 Yacc(Bison) 입력파일은다음 %{ #include <stdio.h> #include <ctype.h> % %token NUMBER line : expr '\n' { printf("%d\n", $1) expr : expr '+' term { $$ = $1 + $3 expr '-' term { $$ = $1 - $3 term term : term '*' factor { $$ = $1 * $3 term '/' factor { $$ = $1 / $3 factor factor : '(' expr ')' { $$ = $2 NUMBER { $$ = $1 int main() { if (yyparse() == 0) printf(" 파싱성공!\n\n") else printf(" 파싱실패!\n\n") 예제 10. 파일이름 calc3.y : 여러자리숫자로이루어진중위수식의값을계산

22 과같다. 이제이두 Lex(Flex) 입력파일과 Yacc(Bison) 입력파일을사용해보도록하자. 다음 C:\Users\JohnDoe> flex calc3.l C:\Users\JohnDoe> bison -d calc3.y C:\Users\JohnDoe> gcc -o calc3 lex.yy.c calc3.tab.c -lfl -ly 과같은순서로명령을실행하여실행파일을만든다. 이렇게만들어진실행파일을다음 C:\Users\JohnDoe> calc3 (53 13) * 파싱성공! 과같이사용한다

23 (4) 네번째예제 : 가상스택기계를위한어셈블리 (assembly) 코드로컴파일하기 컴파일러과목의표준적교재중하나인 Compilers: Principles, Techniques, and Tools (by Aho, Sethi, and Ullman) 의 2.8절에는가상스택기계 (Abstract Stack Machine) 라고부르는페이퍼머신 (paper machine) 이간략하게정의되어있다. 이제 Lex(Flex) 와 Yacc(Bison) 을이용해 Pascal 언어의간단한문장들을이가상스택기계의어셈블리코드로번역하는일을해보자. 이문장들을포함하고있는파일 ( 좀과장하자면 Pascal 프로그램파일 ) 이앞에서몇번사용된 data.p 이다. 아래에다시보였다. day := (1461*y) div 4 + (153*m+2) div 5 + d if a then c := 1 while (c) do c := c

24 Lex(Flex) 입력파일은다음 %{ /* * 추상스택기계의목적코드생성예제 */ #include <string.h> #include "y.tab.h" % delim [ \t\n] ws {delim+ letter [A-Za-z] digit [0-9] id {letter({letter {digit)* number {digit+(\.{digit+)?(e[+\-]?{digit+)? {ws ":=" return(assign) div return(div) mod return(mod) if return(if) then return(then) while return(while) do return(do) {id { strcpy(yylval.lexeme, yytext) return(id) {number { strcpy(yylval.lexeme, yytext) return(num). return(yytext[0]) 예제 11. 파일이름 stack-m.l : 추상스택기계를위한 Pascal 컴파일러 Lex(Flex) 입력 과같다. 상기 Lex(Flex) 입력파일에대해서몇가지설명이필요할듯하다. 첫번째부분을보면여러가지이름 ( delim, ws 등 ) 을정의하는것이있는데, 보통정규정의 (regular definition) 이라고부른다. 이것은두번째부분에서패턴을기술할때사용함으로써패턴기술을알아보기쉽게만들기위한부분식 (subexpression) 정의라고볼수있다. 또새롭게나타난 Lex(Flex) 메타-문자가하나있는데,? 이다. 이문자도거의표준적정규표현에가까운데,? 앞의패턴에해당하는스트링이있을수도있고없을수도있다 (being optional) 는것을나타낸다. 상기파일에서는상수 (number) 패턴을기술하는데분수부분이나지수부분이있을수도있고없을수도있다는점을나타낸것이다. 토큰의추가속성값을전달하기위한변수 yylval 의기본타입은 int 이다. 만약다른타입의값을전달하고싶다면 Yacc(Bison) 의입력파일에서 %union 키워드를이용한다. 뒤의이예제를위한 Yacc(Bison) 입력파일에서보게되겠지만, 현재예제에서토큰의추가속성값타입은 10개의원소를

25 가진문자배열로선언되어있고그값에접근하기위한공용체 (union) 필드 (field) 이름은 lexeme 으로정의되어있다. 따라서상기 Lex(Flex) 입력파일을보면식별자나상수와같은토큰이입력에서인식되면, 그것이입력에서나타난실제스트링 (lexeme) 을 yylval.lexeme 에복사되어파서쪽으로전달하도록되어있다. 이예제를위한 Yacc(Bison) 입력파일은다음 %{ /* * 추상스택기계의목적코드생성예제 */ #include <stdio.h> #include <string.h> char *tmp_lbl1, *tmp_lbl2 % %union { char lexeme[10] %start list %token ID NUM DIV MOD ASSIGN IF THEN WHILE DO list : list '' stmt stmt stmt : ID ASSIGN { printf("\tlvalue\t%s\n", $1) expr { printf("\t:=\n") IF expr { tmp_lbl1 = new_lbl_no() printf("\tgofalse\t%s\n", tmp_lbl1) THEN stmt { printf("label\t%s\n", tmp_lbl1) WHILE { tmp_lbl1 = new_lbl_no() printf("label\t%s\n", tmp_lbl1) expr { tmp_lbl2 = new_lbl_no() printf("\tgofalse\t%s\n", tmp_lbl2) DO stmt { printf("\tgoto\t%s\n", tmp_lbl1)

26 printf("label\t%s\n", tmp_lbl2) expr : expr '+' term { printf("\t+\n") expr '-' term { printf("\t-\n") term term : term '*' factor { printf("\t*\n") term '/' factor { printf("\t/\n") term DIV factor { printf("\tdiv\n") term MOD factor { printf("\tmod\n") factor factor : '(' expr ')' ID { printf("\trvalue\t%s\n", $1) NUM { printf("\tpush\t%s\n", $1) char* new_lbl_no(void) { static int lbl_no = 0 char buf[4] int i, quot char *lbl_header lbl_header = (char *)malloc(5) strcpy(lbl_header, "lbl_") buf[3] = '\0' quot = lbl_no++ for (i = 2 - (quot / 10) i >= 0 i--) { buf[i] = '0' + quot % 10 quot = quot / 10 return((char *)strcat(lbl_header, buf)) int main(void) { printf("\ncompilation for Abstract Stack Machine Started...\n\n") printf("\nassembly code for Abstract Stack Machine follows...\n\n") if (yyparse() == 0) printf("\n\ncompilation for Abstract Stack Machine Completed!\n") else printf("\n\ncompilation for Abstract Stack Machine Failed!\n") 예제 12. 파일이름 stack-m.y : 추상스택기계를위한 Pascal 컴파일러 Yacc(Bison) 입력

27 과같다. 상기파일의첫번째부분에나오는 %start 키워드는그다음에오는식별자가두번째부분에기술되어있는문법의시작기호 (start symbol) 라는점을선언하는것이다. 만약이게없으면문법의첫번째생성규칙의좌변에있는비단말기호를시작기호로 Yacc(Bison) 은생각한다. 세번째부분에정의되어있는 new_lbl_no 함수는과거만든레이블 (label) 과는다른새로운레이블을만들어서돌려주는함수이다. 상기 Lex(Flex) 입력파일과 Yacc(Bison) 입력파일을이용하여실행파일은다음 C:\Users\JohnDoe> flex stack-m.l C:\Users\JohnDoe> bison -yd stack-m.y C:\Users\JohnDoe> gcc -o stack-m lex.yy.c y.tab.c -lfl -ly 과같이만든다. 이렇게만들어진실행파일에입력으로앞에나온 data.p 파일을주고실행하여그 결과를 data.asm 이라는파일 ('asm' 이라는확장자는 assembly code 를나타내는뜻에서붙였다 ) 에다 음 C:\Users\JohnDoe> stack-m < data.p > data.asm 과같이저장한다. 이결과 ( data.p 파일에들어있는 Pascal 프로그램을추상스택기계의어셈블리코 드로번역한결과 ) 파일 data.asm 의내용은다음

28 Compilation for Abstract Stack Machine Started... Assembly code for Abstract Stack Machine follows... label label label lvalue day push 1461 rvalue y * push 4 div push 153 rvalue m * push 2 + push 5 div + rvalue d + := rvalue a gofalse lbl_000 lvalue c push 1 := lbl_000 lbl_001 rvalue c gofalse lbl_002 lvalue c rvalue c push 1 - := goto lbl_001 lbl_002 Compilation for Abstract Stack Machine Completed! 과같다

29 4. 맺는말 이상으로몇가지예제를이용하여컴파일러구성을보조하는대표적소프트웨어도구인 Lex(Flex) 와 Yacc(Bison) 의작동을살펴보았다. 넓게보면모든프로그램은정해진형식의입력을처리하여역시정해진형식의출력을내보낸다는측면에서일종의컴파일러이다. 이말은곧컴파일러구성에사용되는여러기법이다른분야의프로그램작성에도폭넓게적용될수있음을의미한다. 마찬가지로 Lex(Flex) 와 Yacc(Bison) 의응용범위도매우광범위하게미칠수있다

商用

商用 商用 %{ /* * line numbering 1 */ int lineno = 1 % \n { lineno++ ECHO ^.*$ printf("%d\t%s", lineno, yytext) $ lex ln1.l $ gcc -o ln1 lex.yy.c -ll day := (1461*y) div 4 + (153*m+2) div 5 + d if a then c :=

More information

lex-yacc-tutorial.hwp

lex-yacc-tutorial.hwp 컴파일러 구성을 위한 대표적 소프트웨어 도구인 Lex(또는 Flex)와 Yacc(또는 Bison) 입문: Windows 환경에서 김도형(성신여자대학교 IT학부) 0. 소개 (1) Lex와 Yacc은 무엇인가? 컴파일러의 구성을 도와주는 대표적인 소프트웨어 도구들이다. 원래 UNIX의 산실인 벨 연구소(AT&T Bell Laboratories)에서 UNIX 시스템의

More information

컴파일러

컴파일러 YACC 응용예 Desktop Calculator 7/23 Lex 입력 수식문법을위한 lex 입력 : calc.l %{ #include calc.tab.h" %} %% [0-9]+ return(number) [ \t] \n return(0) \+ return('+') \* return('*'). { printf("'%c': illegal character\n",

More information

EA0015: 컴파일러

EA0015: 컴파일러 4 Flex 무엇을공부하나? " 어휘분석기 (lexical analyzer 혹은 scanner)" 는다음과같은과정을거쳐서프로그램된다. 1 토큰정의, 2 정규식으로표현, 3 NFA로변환, 4 DFA로변환, 5 프로그램작성 위과정은앞장에서배운바와같이기계적으로이루어질수있다. "Flex(Fast Lexical Analyzer)" 는컴파일러개발자를위하여위과정을자동으로처리해주는도구이다.

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

3장 어휘분석

3장 어휘분석 Video & Image VIPL Processing Lab. Compiler Construction 한국방송통신대학교컴퓨터과학과출석수업 제 2012-2 공학박사김명진 (HCI & 지능형로봇연구소 ) 숭실대학교연구교수 컴파일러교재구성 2장 : 형식언어와오토마타 3장 : 어휘분석 4장 : Contex-free 언어와푸시다운오토마타 5장 : 구문분석 2 어휘분석

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 13 렉스와야크 01 렉스와야크 02 렉스와야크의입력파일형식 03 플렉스와바이슨설치방법 04 플렉스사용법 05 바이슨사용법 렉스와야크의개념에대해이해할수있다. 렉스의입력파일형식과야크의입력파일형식에대해이해할수있다. 플렉스와바이슨의설치방법에대해이해할수있다. 플렉스사용법에대해이해할수있다. 바이슨사용법에대해이해할수있다. 13.1 렉스와야크 프로그래밍언어와컴퓨터구조가다양해짐에따라

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향

More information

슬라이드 1

슬라이드 1 3 장. 선행자료 어휘원소, 연산자와 C 시스템 박종혁교수 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr SeoulTech 2019-1 st 프로그래밍입문 (1) 2 목차 1.1 문자와어휘원소 1.2 구문법칙 1.3 주석 1.4 키워드 (Keyword) 1.5 식별자 (Identifier) 1.6 상수 (Integer,

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

untitled

untitled 시스템소프트웨어 : 운영체제, 컴파일러, 어셈블러, 링커, 로더, 프로그래밍도구등 소프트웨어 응용소프트웨어 : 워드프로세서, 스프레드쉬트, 그래픽프로그램, 미디어재생기등 1 n ( x + x +... + ) 1 2 x n 00001111 10111111 01000101 11111000 00001111 10111111 01001101 11111000

More information

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D> 리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1

More information

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을

More information

슬라이드 1

슬라이드 1 2 장. 어휘원소, 연산자와 C 시스템 박종혁교수 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr SeoulTech 2018-1 st 프로그래밍입문 (1) 2 목차 2.1 문자와어휘원소 2.2 구문법칙 2.3 주석 2.4 키워드 (Keyword) 2.5 식별자 (Identifier) 2.6 상수 (Integer,

More information

EA0015: 컴파일러

EA0015: 컴파일러 5 Context-Free Grammar 무엇을공부하나? 앞에서배운 " 정규식 " 은언어의 " 어휘 (lexeme)" 를표현하는도구로사용되었다. 언어의 " 구문 (syntax)" 은 " 정규언어 " 의범위를벗어나기때문에 " 정규식 " 으로표현이불가능하다. 본장에서배우는 " 문맥자유문법 " 은언어의 " 구문 (syntax)" 을표현할수있는도구이다. 어떤 " 문맥자유문법

More information

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음 프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음 CHAPTER 9 둘중하나선택하기 관계연산자 두개의피연산자를비교하는연산자 결과값은참 (1) 아니면거짓 (0) x == y x 와 y 의값이같은지비교한다. 관계연산자 연산자 의미 x == y x와 y가같은가? x!= y

More information

C 프로그래밍 언어 입문 C 프로그래밍 언어 입문 김명호저 숭실대학교 출판국 머리말..... C, C++, Java, Fortran, Python, Ruby,.. C. C 1972. 40 C.. C. 1999 C99. C99. C. C. C., kmh ssu.ac.kr.. ,. 2013 12 Contents 1장 프로그래밍 시작 1.1 C 10 1.2 12

More information

자연언어처리

자연언어처리 제 7 장파싱 파싱의개요 파싱 (Parsing) 입력문장의구조를분석하는과정 문법 (grammar) 언어에서허용되는문장의구조를정의하는체계 파싱기법 (parsing techniques) 문장의구조를문법에따라분석하는과정 차트파싱 (Chart Parsing) 2 문장의구조와트리 문장 : John ate the apple. Tree Representation List

More information

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap06-1Array.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어

More information

Microsoft PowerPoint - Perpect C 02.ppt [호환 모드]

Microsoft PowerPoint - Perpect C 02.ppt [호환 모드] 02 C 프로그래밍기초 충남대학교이형주 1 C 프로그램구조 콘솔응용프로그램 2 프로그램실행순서 C 프로그램은여러함수의조합으로구성 함수란정해진규칙에의하여일련의작업을수행하는프로그램의단위 실행순서 main 함수는프로그램이실행되면가장먼저시작되는부분 모든함수내부에서는위에서아래로, 좌에서우로, 문장이위치한순서대로실행 3 전처리기 전처리기 (preprocessor) 미리처리하는프로그램으로,

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

C 언어 프로그래밊 과제 풀이

C 언어 프로그래밊 과제 풀이 과제풀이 (1) 홀수 / 짝수판정 (1) /* 20094123 홍길동 20100324 */ /* even_or_odd.c */ /* 정수를입력받아홀수인지짝수인지판정하는프로그램 */ int number; printf(" 정수를입력하시오 => "); scanf("%d", &number); 확인 주석문 가필요한이유 printf 와 scanf 쌍

More information

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - chap04-연산자.pptx int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); } 1 학습목표 수식의 개념과 연산자, 피연산자에 대해서 알아본다. C의 를 알아본다. 연산자의 우선 순위와 결합 방향에

More information

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4> 쉽게풀어쓴 C 언어 Express 제 2 장프로그램개발과정 통합개발환경 통합개발환경 (IDE: integrated development environment) 에디터 + 컴파일러 + 디버거 Visual C++: 이클립스 (eclipse): Dev-C++: 마이크로소프트제작 오픈소스프로젝트 오픈소스프로젝트 통합개발환경의종류 비주얼 C++(Visual C++)

More information

Microsoft PowerPoint - ch01.ppt

Microsoft PowerPoint - ch01.ppt 201-1 학기프로그래밍입문 (1) 1 장. C 의개요 박종혁 Tel: 970-6702 Email: jhpark1@s.ac.kr 0 C 의개요 C-Language 란? - 원하는결과를얻어내기위한 Program 작성시필요한일종의언어 - Unix 운영체제하에서시스템프로그래밍을하기위해개발된언어 - 구조적인언어, 강력한기능, 빠른속도 C 언어의역사 - ALGOL60

More information

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100 2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap13-입출력라이브러리.pptx #include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 스트림의 기본 개념을 알아보고,

More information

11장 포인터

11장 포인터 Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함

More information

Chapter_06

Chapter_06 프로그래밍 1 1 Chapter 6. Functions and Program Structure April, 2016 Dept. of software Dankook University http://embedded.dankook.ac.kr/~baeksj 이장의강의목표 2 문자의입력방법을이해한다. 중첩된 if문을이해한다. while 반복문의사용법을익힌다. do 반복문의사용법을익힌다.

More information

PowerPoint Presentation

PowerPoint Presentation #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을작성하면서 C 프로그램의구성요소에대하여알아본다.

More information

Microsoft PowerPoint - chap08-1 [호환 모드]

Microsoft PowerPoint - chap08-1 [호환 모드] 2011-1 학기프로그래밍입문 (1) 참고자료 : chapter 8-1. 전처리 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 전처리명령어 컴파일과정에는전처리 (preprocessing) 단계가있다. - 컴파일러는목적파일을만들기전에전처리라고하는특별한작업을

More information

슬라이드 1

슬라이드 1 1 장. C 의개요 박종혁교수 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr SeoulTech 2017-1 st 프로그래밍입문 (1) 2 C 의개요 C-Language 란? 원하는결과를얻어내기위한 Program 작성시필요한일종의언어 Unix 운영체제하에서시스템프로그래밍을하기위해개발된언어 구조적인언어, 강력한기능,

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 2 장 : C 프로그램시작하기 2012 년 이은주 학습목표 을작성하면서 C 프로그램의구성요소 주석 (comment) 이란무엇인지알아보고, 주석을만드는방법 함수란무엇인지알아보고, C 프로그램에반드시필요한 main 함수 C 프로그램에서출력에사용되는 printf 함수 변수의개념과변수의값을입력받는데사용되는 scanf 함수 2 목차 프로그램코드

More information

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 Eclipse (IDE) JDK Android SDK with ADT IDE: Integrated Development Environment JDK: Java Development Kit (Java SDK) ADT: Android Development Tools 2 JDK 설치 Eclipse

More information

K&R2 Reference Manual 번역본

K&R2 Reference Manual 번역본 typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

슬라이드 1

슬라이드 1 Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치

More information

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap12-고급기능.pptx #include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 가 제공하는 매크로 상수와 매크로

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 08 함수 01 함수의개요 02 함수사용하기 03 함수와배열 04 재귀함수 함수의필요성을인식한다. 함수를정의, 선언, 호출하는방법을알아본다. 배열을함수의인자로전달하는방법과사용시장점을알아본다. 재귀호출로해결할수있는문제의특징과해결방법을알아본다. 1.1 함수의정의와기능 함수 (function) 특별한기능을수행하는것 여러가지함수의예 Page 4 1.2

More information

C 프로그램의 기본

C 프로그램의 기본 C 프로그램의기본 목차 C 프로그램의구성요소 주석 main 함수 출력 C 언어의입력과출력 변수 printf 함수 scanf 함수 2 예제 2-1 : 첫번째 C 프로그램 3 2.1.1 주석 주석의용도 프로그램에대한설명 프로그램전체에대한대략적인정보를제공 프로그램수행에영향을미치지않는요소 4 2.1.1 주석 주석사용방법 /* 과 */ 을이용한여러줄주석 // 을이용한한줄주석

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 06 반복문 01 반복문의필요성 02 for문 03 while문 04 do~while문 05 기타제어문 반복문의의미와필요성을이해한다. 대표적인반복문인 for 문, while 문, do~while 문의작성법을 알아본다. 1.1 반복문의필요성 반복문 동일한내용을반복하거나일정한규칙으로반복하는일을수행할때사용 프로그램을좀더간결하고실제적으로작성할수있음.

More information

중간고사

중간고사 중간고사 예제 1 사용자로부터받은두개의숫자 x, y 중에서큰수를찾는알고리즘을의사코드로작성하시오. Step 1: Input x, y Step 2: if (x > y) then MAX

More information

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4 Introduction to software design 2012-1 Final 2012.06.13 16:00-18:00 Student ID: Name: - 1 - 0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x

More information

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi

More information

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - chap05-제어문.pptx int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); 1 학습목표 제어문인,, 분기문에 대해 알아본다. 인 if와 switch의 사용 방법과 사용시 주의사항에 대해 알아본다.

More information

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,

More information

Semantic Consistency in Information Exchange

Semantic Consistency in Information Exchange 제 3 장시맨틱스 (Semantics) Reading Chap 13 숙대창병모 1 시맨틱스의필요성 프로그램의미의정확한이해 소프트웨어의정확한명세 소프트웨어시스템에대한검증혹은추론 컴파일러혹은해석기작성의기초 숙대창병모 2 3.1 Operational Semantics 숙대창병모 3 의미론의종류 Operational Semantics 프로그램의동작과정을정의 Denotational

More information

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070> #include "stdafx.h" #include "Huffman.h" 1 /* 비트의부분을뽑아내는함수 */ unsigned HF::bits(unsigned x, int k, int j) return (x >> k) & ~(~0

More information

ABC 2장

ABC 2장 3 장 C 프로그램을이루는구성요소 김명호 내용 주석문 토큰 키워드 식별자 상수 문자열상수 구두자 1 구문 Syntax 올바른프로그램을만들수있게하는규칙 컴파일러 C 프로그램이구문에맞는지검사 오류가있다면, 오류메시지출력 오류가없다면, 목적코드생성 전처리기 컴파일러이전에호출 2 컴파일러 컴파일과정 C 프로그램 토큰으로분리 토큰을목적코드로변환 토큰종류 : 키워드,

More information

Microsoft PowerPoint - chap-03.pptx

Microsoft PowerPoint - chap-03.pptx 쉽게풀어쓴 C 언어 Express 제 3 장 C 프로그램구성요소 컴퓨터프로그래밍기초 이번장에서학습할내용 * 주석 * 변수, 상수 * 함수 * 문장 * 출력함수 printf() * 입력함수 scanf() * 산술연산 * 대입연산 이번장에서는 C프로그램을이루는구성요소들을살펴봅니다. 컴퓨터프로그래밍기초 2 일반적인프로그램의형태 데이터를받아서 ( 입력단계 ), 데이터를처리한후에

More information

PowerPoint Presentation

PowerPoint Presentation Lecture 01: Compiler Overview Kwang-Man Ko kkmam@sangji.ac.kr, compiler.sangji.ac.kr Department of Computer Engineering Sang Ji University 2019 강의정보 교과목명 : 컴파일러 개설학과 : 컴퓨터공학과 4학년 학점및시수 : 3학점 3시간 강의시간 :

More information

11장 포인터

11장 포인터 누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음

More information

Microsoft PowerPoint 웹 연동 기술.pptx

Microsoft PowerPoint 웹 연동 기술.pptx 웹프로그래밍및실습 ( g & Practice) 문양세강원대학교 IT 대학컴퓨터과학전공 URL 분석 (1/2) URL (Uniform Resource Locator) 프로토콜, 호스트, 포트, 경로, 비밀번호, User 등의정보를포함 예. http://kim:3759@www.hostname.com:80/doc/index.html URL 을속성별로분리하고자할경우

More information

Microsoft PowerPoint - chap-02.pptx

Microsoft PowerPoint - chap-02.pptx 쉽게풀어쓴 C 언어 Express 제 2 장프로그램개발과정 컴퓨터프로그래밍기초 프로그램작성과정 에디터 (editer) 컴파일러 (compiler) 링커 (linker) 로더 (loader) 소스파일 test.c 오브젝트파일 test.obj 실행파일 test.exe 통합개발환경 (IDE) 컴퓨터프로그래밍기초 2 프로그램작성단계 편집 (edit) 에디터를이용하여원하는작업의내용을기술하여소스코드작성

More information

제4장 기본 의미구조 (Basic Semantics)

제4장  기본 의미구조 (Basic Semantics) 제 4 장블록및유효범위 Reading Chap. 5 숙대창병모 1 4.1 변수선언및유효범위 숙대창병모 2 변수선언과유효범위 변수선언 Declaration before Use! 대부분의언어에서변수는사용전에먼저선언해야한다. 변수의유효범위 (scope) 선언된변수가유효한 ( 사용될수있는 ) 프로그램내의범위 / 영역 변수이름뿐아니라함수등다른이름도생각해야한다. 정적유효범위

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 15 고급프로그램을 만들기위한 C... 1. main( ) 함수의숨겨진이야기 2. 헤더파일 3. 전처리문과예약어 1. main( ) 함수의숨겨진이야기 main( ) 함수의매개변수 [ 기본 14-1] main( ) 함수에매개변수를사용한예 1 01 #include 02 03 int main(int argc, char* argv[])

More information

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - Java7.pptx HPC & OT Lab. 1 HPC & OT Lab. 2 실습 7 주차 Jin-Ho, Jang M.S. Hanyang Univ. HPC&OT Lab. jinhoyo@nate.com HPC & OT Lab. 3 Component Structure 객체 (object) 생성개념을이해한다. 외부클래스에대한접근방법을이해한다. 접근제어자 (public & private)

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드]

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드] Chapter 15 문자열 2009 한국항공대학교항공우주기계공학부 (http://mercury.kau.ac.kr/sjkwon) 1 문자의집합체 문자열의정의 일련의문자 C 언어에서문자열앞뒤에인용부호 를이용 문자와문자열과의차이 문자열의저장 (1) 배열을이용하는방법 문자열상수 c c language 를저장하는문자열배열 항상문자열마지막에는 NULL문자를넣어야함 (2)

More information

C++ Programming

C++ Programming C++ Programming 연산자다중정의 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 연산자다중정의 C++ 스타일의문자열 2 연산자다중정의 연산자다중정의 단항연산자다중정의 이항연산자다중정의 cin, cout 그리고 endl C++ 스타일의문자열 3 연산자다중정의 연산자다중정의 (Operator

More information

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문 1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문 1. 표준입출력 표준입출력 입력 : 키보드, scanf 함수 출력 : 모니터, printf 함수문제 : 정수값 2개를입력받고두값사이의값들을더하여출력하라. #include int main(void) int Num1, Num2; int

More information

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor 19. 전처리와분할컴파일 순천향대학교컴퓨터학부이상정 1 학습내용 전처리명령어 #include #define 기호상수 const 분할컴파일 순천향대학교컴퓨터학부이상정 2 전처리과정 전처리 (preprocessor) 전처리명령어는 # 기호로시작 #incldue #define 순천향대학교컴퓨터학부이상정 3 #include (1) 지정된파일을프로그램에삽입 꺽쇠괄호는포함할파일을컴파일러에설정되어있는특정디렉토리에서검색

More information

untitled

untitled if( ) ; if( sales > 2000 ) bonus = 200; if( score >= 60 ) printf(".\n"); if( height >= 130 && age >= 10 ) printf(".\n"); if ( temperature < 0 ) printf(".\n"); // printf(" %.\n \n", temperature); // if(

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean

More information

11장 포인터

11장 포인터 쉽게풀어쓴 C 언어 Express 제 12 장문자와문자열 이번장에서학습할내용 문자표현방법 문자열표현방법 문자열이란무엇인가? 문자열의입출력 문자처리라이브러리함수 표준입출력라이브러리함수 인간은문자를사용하여정보를표현하므로문자열은프로그램에서중요한위치를차지하고있다. 이번장에서는 C 에서의문자열처리방법에대하여자세히살펴볼것이다. 문자의중요성 인간한테텍스트는대단히중요하다.

More information

13 주차문자열의표현과입출력

13 주차문자열의표현과입출력 13 주차문자열의표현과입출력 문자표현방법 문자열표현방법 문자열이란무엇인가? 문자열의입출력 문자처리라이브러리함수 표준입출력라이브러리함수 C 언어를이용하여문자열을처리하기위해서는문자형의배열이나포인터를사용하게된다. 문자열을처리하는동작으로는단순하게문자열의입력이나출력기능이외에도문자열의복사나치환, 문자열의길이를구하거나문자열을비교하는기능등많은기능을필요로한다. 그러나이러한기능들을모두구현하기란매우까다로우며,

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

C 프로그래밊 개요

C 프로그래밊 개요 구조체 2009 년 5 월 19 일 김경중 강의계획수정 일자계획 Quiz 실습보강 5 월 19 일 ( 화 ) 구조체 Quiz ( 함수 ) 5 월 21 일 ( 목 ) 구조체저녁 6 시 5 월 26 일 ( 화 ) 포인터 5 월 28 일 ( 목 ) 특강 (12:00-1:30) 6 월 2 일 ( 화 ) 포인터 Quiz ( 구조체 ) 저녁 6 시 6 월 4 일 ( 목

More information

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2 제 17 장동적메모리와연결리스트 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다.

More information

윤성우의 열혈 TCP/IP 소켓 프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍 C 프로그래밍프로젝트 Chap 22. 구조체와사용자정의자료형 1 2013.10.10. 오병우 컴퓨터공학과 구조체의정의 (Structure) 구조체 하나이상의기본자료형을기반으로사용자정의자료형 (User Defined Data Type) 을만들수있는문법요소 배열 vs. 구조체 배열 : 한가지자료형의집합 구조체 : 여러가지자료형의집합 사용자정의자료형 struct

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Development Environment 2 Jo, Heeseung make make Definition make is utility to maintain groups of programs Object If some file is modified, make detects it and update files related with modified one It

More information

1. 27 (token descriptions) (regular expressions), grep egrep.. C. 1),., C (expressions), (statements), (declarations), (blocks) (procedures). (parsing

1. 27 (token descriptions) (regular expressions), grep egrep.. C. 1),., C (expressions), (statements), (declarations), (blocks) (procedures). (parsing (lex) (yacc). (object code) C. (unit).. C,,,,. ( ) (lexical analysis) (lexing). C (routine). (lexical analyzer) (lexer) (scanner). (lex specification). 1. 27 (token descriptions) (regular expressions),

More information

Microsoft PowerPoint - chap-02.pptx

Microsoft PowerPoint - chap-02.pptx 쉽게풀어쓴 C 언어 Express 제 2 장프로그램개발과정 컴퓨터프로그래밍기초 프로그램작성과정 에디터 (editer) 컴파일러 (compiler) 링커 (linker) 로더 (loader) 소스파일 test.c 오브젝트파일 test.obj 실행파일 test.exe 통합개발환경 (IDE) 컴퓨터프로그래밍기초 2 프로그램작성단계 편집 (edit) 에디터를이용하여원하는작업의내용을기술하여소스코드작성

More information

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드] Chapter 03 변수와자료형 2009 한국항공대학교항공우주기계공학부 (http://mercury.kau.ac.kr/sjkwon) 1 변수와자료유형 변수 프로그램에서자료값을임시로기억할수있는저장공간을변수 (variables) 변수 (Variables) 는컴퓨터의메모리인 RAM(Random Access Memory) 에저장 물건을담는박스라고생각한다면박스의크기에따라담을물건이제한됨

More information

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt 변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short

More information

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 개발환경구조및설치순서 JDK 설치 Eclipse 설치 안드로이드 SDK 설치 ADT(Androd Development Tools) 설치 AVD(Android Virtual Device) 생성 Hello Android! 2 Eclipse (IDE) JDK Android SDK with

More information

Microsoft PowerPoint - chap4_2013 [호환 모드]

Microsoft PowerPoint - chap4_2013 [호환 모드] Part 04 입출력과전처리 1 전처리기지시자 전처리기 (preprocessor) 컴파일러가프로그램을번역하기 ' 전 ' 에소스프로그램을 ' 처리 ' 하는프로그램 전처리기지시자 (preprocessor directive) 전처리기에게특정작업을지시하는가짜명령어 ( 의사명령어 ) # 으로시작함 중요한전처리기지시자 #include: 다른파일의내용을현재파일에포함시킴

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 10 포인터 01 포인터의기본 02 인자전달방법 03 포인터와배열 04 포인터와문자열 변수의주소를저장하는포인터에대해알아본다. 함수의인자를값과주소로전달하는방법을알아본다. 포인터와배열의관계를알아본다. 포인터와문자열의관계를알아본다. 1.1 포인터선언 포인터선언방법 자료형 * 변수명 ; int * ptr; * 연산자가하나이면 1 차원포인터 1 차원포인터는일반변수의주소를값으로가짐

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 누구나즐기는 C 언어콘서트 제 5 장조건문 이번장에서학습할내용 조건문이란? if 문 if, else 문 중첩 if 문 switch 문 goto 문 이제까지는문장들이순차적으로실행된다고하였다. 하지만필요에따라서조건이만족되면문장의실행순서를변경할수있는기능이제공된다. 조건문 조건에따라서여러개의실행경로가운데하나를선택 문장이실행되는순서에영향을주는문장 조건에따라서여러개의같은처리를반복

More information

10 강. 쉘스크립트 l 쉘스크립트 Ÿ 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 Ÿ 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 Ÿ 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다

10 강. 쉘스크립트 l 쉘스크립트 Ÿ 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 Ÿ 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 Ÿ 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다 10 강. 쉘스크립트 쉘스크립트 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다른운영체제로이식되지않음 -스크립트언어를사용하면컴파일과정이없고인터프리터가소스파일에서명령문을판독하여각각의명령을수행

More information

슬라이드 1

슬라이드 1 마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님 학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다. 1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //***

More information

Chapter 4. LISTS

Chapter 4. LISTS 6. 동치관계 (Equivalence Relations) 동치관계 reflexive, symmetric, transitive 성질을만족 "equal to"(=) 관계는동치관계임. x = x x = y 이면 y = x x = y 이고 y = z 이면 x = z 동치관계를이용하여집합 S 를 동치클래스 로분할 동일한클래스내의원소 x, y 에대해서는 x y 관계성립

More information

슬라이드 1

슬라이드 1 1 장. C 의개요 박종혁교수 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr SeoulTech 2018-1 st 프로그래밍입문 (1) 2 C 의개요 C-Language 란? 원하는결과를얻어내기위한 Program 작성시필요한일종의언어 Unix 운영체제하에서시스템프로그래밍을하기위해개발된언어 구조적인언어, 강력한기능,

More information

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - C++ 5 .pptx C++ 언어프로그래밍 한밭대학교전자. 제어공학과이승호교수 연산자중복 (operator overloading) 이란? 2 1. 연산자중복이란? 1) 기존에미리정의되어있는연산자 (+, -, /, * 등 ) 들을프로그래머의의도에맞도록새롭게정의하여사용할수있도록지원하는기능 2) 연산자를특정한기능을수행하도록재정의하여사용하면여러가지이점을가질수있음 3) 하나의기능이프로그래머의의도에따라바뀌어동작하는다형성

More information

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7> 제14장 동적 메모리 할당 Dynamic Allocation void * malloc(sizeof(char)*256) void * calloc(sizeof(char), 256) void * realloc(void *, size_t); Self-Referece NODE struct selfref { int n; struct selfref *next; }; Linked

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 DEVELOPMENT ENVIRONMENT 2 MAKE Jo, Heeseung MAKE Definition make is utility to maintain groups of programs Object If some file is modified, make detects it and update files related with modified one 2

More information

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과

More information

Microsoft PowerPoint - Chapter_08.pptx

Microsoft PowerPoint - Chapter_08.pptx 프로그래밍 1 1 Chapter 8. Pointers May, 2016 Dept. of software Dankook University http://embedded.dankook.ac.kr/~baeksj 포인터의개념 (1/6) 2 포인터란 : 다른객체를가리키는변수 객체의메모리주소를저장하는변수 기호적방식 (symbolic way) 으로주소사용 포인터와관련된연산자

More information

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조 - Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 C 언어개요 Jo, Heeseung 이장의내용 C 언어소개간단한 C 프로그램명령줄프로그래밍 C 프로그램의이해 2 C 언어소개 C 언어유래 1972 년 Dennis Ritchie 가설계함 UNIX 운영체제개발에사용됨 C 언어에직접영향을준언어들 Algol CPL BCPL B C C 언어의특징 구조화된언어로서모듈별설계가가능 높은이식성 - 다양한하드웨어에서사용가능

More information

1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 #define _CRT_SECURE_NO_WARNINGS #include #include main() { char ch; printf(" 문자 1개를입력하시오 : "); scanf("%c", &ch); if (isalpha(ch))

More information