CS/프로그래밍언어론

CS/프로그래밍언어론

[프로그래밍언어론] 7. Parsing Problem

파서의 목표는 소스코드를 받아서 파싱을 한 뒤, Parse Tree 를 만드는 것이다.만약 파싱하다가 실패했다면 소스코드에서 문법에 맞지 않는 부분이 있었다는 뜻이므로,파서는 syntax error 가 발생했다는 걸 알려줘야 한다. 잘 동작하는 파서는 파싱할 때 토큰 1개를 더 앞서 볼 수 있다. (look ahead, LA)그래야 알맞는 BNF 문법을 체크할 수 있다. 파서에는 2가지 카테고리가 있다.첫번째는 탑-다운 / 두번째는 바텀-업 이다.탑 - 다운 파서탑-다운 파서는 root 부터 시작해서 아래로 내려가면서 파스 트리를 만든다.탑-다운 파서는 왼쪽에서부터 파고들어 본다. (즉 pre-order 순으로 파싱트리를 만든다.)xAα 라는 sentential form 이 주어..

CS/프로그래밍언어론

[프로그래밍언어론] 6. C언어의 BNF 문법과 파싱 예제

BNF 따라가기 BNF 문법은 나중에 YACC 라는 프로그램에 들어가 Parser 를 만든다. (야크는 파서 제너레이터이다.) 이번 글에서는 BNF 문법을 보고 주어진 C 코드를 파서가 어떻게 파싱하게 될 지 파싱트리를 그리는 과정을 직접해보고자 한다. 이 과정을 수행하려면 우선 lexical analyzer 에 의해 소스코드가 각각의 렉시컬 토큰 조각들로 구분이 되어있어야 한다. 소스코드에서 렉시컬 토큰을 추출하는 과정은 아래의 lex 코드를 참고하자. // 강의록에서 ANSI C grammer, Lex specification.pdf 에 있는 코드입니다. D [0-9] L [a-zA-Z_] H [a-fA-F0-9] E [Ee][+-]?{D}+ FS (f|F|l|L) IS (u|U|l|L)* %{ #i..

CS/프로그래밍언어론

[프로그래밍언어론] 5. Lexical and Syntax Analysis

만약 우리가 컴파일러를 만든다면, 첫번째로 할 일은 문자열 덩어리인 소스코드를 분석해서 렉심을 추출하는 (렉시컬 토큰을 추출) lexical analysis 과정을 먼저 거쳐야 한다. 다음으론 추출한 렉시컬 토큰들을 기반으로 문법이 올바른지 검사하는 syntax analysis 를 해야한다. 이때 문법을 표현하는 기법의 하나로 BNF를 사용했다. 이를 다시말하면, syntax analysis 를 할 때는 lexical analyzer 를 이용해 렉시컬 토큰을 추출하는 과정을 먼저 거쳐야 한다. 이 과정을 low-level part 라고도 한다. 이 과정을 수행할 땐 정규 표현식을 이용하거나, 제대로 하려면 오토마타 개념을 이용하여 추출해야 한다. 다음으론 high-level part 인 syntax an..

CS/프로그래밍언어론

[프로그래밍언어론] 4. Semantics

Static Semantics & Attribute Grammar프로그래밍 언어의 큰 2가지 축은 Syntax 와 Semantics다.syntax(문법)은 지금 들어온 코드의 문법이 맞다 틀리다만 판단할 수 있다.하지만 이 문법만 가지고는 문장의 의미를 알 수 없다. 코드를 예로 든다면, 먼저 변수를 선언하고나서 값을 할당해야하는데, 선언하지도 않은 변수에 값을 할당하는 것은 문법적으로는 옳을 수 있어도 문맥상, 의미상으로는 올바르지 않은 코드이다. Static Semantics 는 컴파일하는 순간에 알 수 있으며, 프로그램  실행 중 변하지 않는 시멘틱스 정보다.Attribute Grammars (AG) 는 static semantics 정보를 최대한 알아내고자 등장했다. AG는 CF..

CS/프로그래밍언어론

[프로그래밍언어론] 3. Syntax 와 BNF, Parse Tree

개요syntax와 semantics는 프로그래밍 언어의 2가지 축이다.syntax는 문법과 문법에 따라 만들어 놓은 문장을 의미한다.semantics는 수식, 문장, 프로그램 유닛들이 지니는 의미를 말한다. 예를 들어 x = 3 이라는 문장이 주어졌을 때syntax는 'x' 라는 문자 옆에 '=' 이라는 문자, '3' 이라는 문자가 올 수 있다는 그 문법을 체크하는 것이 목표고,semantics 는 x가 변수, = 가 대입 연산자, 3은 정수라는 의미를 부여하는 것이 목표이다. 문법은 문장이 어떻게 쓰여야 하는지 그 규칙을 기술한 것.시멘틱은 각 문장과 그 요소들이 갖는 의미를 기술한 것이라고 볼 수 있다.Syntaxsentence (문장) : 문자들의 집합language (언어)..

CS/프로그래밍언어론

[프로그래밍언어론] 2. 프로그래밍 언어의 진화

Zuze's Plankalkul세계 최초의 컴퓨터 x1을 프로그래밍하기 위해 나온 언어1945년에 나온 언어인데, 이때 벌써 floating point, array, record 의 개념과 상수가 정의되어 있었다. A[5] = A[4] + 1 를 이렇게 썼고, 1.n 은 데이터 타입을 나타낸 표기라고 한다. Pseudocodes등장 배경컴퓨터가 등장했을 때, 사람들은 컴퓨터에 기계어로 명령을 직접 내려야 했다.기계어는 읽기, 수정하기, 의사표현하기가 매우 힘든 언어였고, index, floating point 의 개념도 없었다. - Short Code (BINAC 컴퓨터에 사용한 슈도 코드) - SpeedCoding (IBM 701 컴퓨터에 사용)700개의 단어 밖에 사용하지 ..

CS/프로그래밍언어론

[프로그래밍언어론] 1. 프로그래밍 언어의 개념

프로그래밍 언어의 개념을 공부하는 이유- 아이디어 표현 능력 향상- 적절한 언어를 선택하는데 필요한 배경 지식 습득- 새로운 언어 학습 능력 향상- 프로그래밍 언어의 구현 방식에 대한 깊은 이해와 이를 바탕으로한 기존 언어에 대한 이해도 향상 프로그래밍 분야- 과학 분야 (큰 수의 부동 소수점 계산 등) → Fortran- 경영 분야 (레포트 생성, 10진수 숫자와 문자 사용)  → COBOL- 인공 지능 (심볼릭 컴퓨테이션 = 기호를 이용한 논리 전개, 링크드 리스트 사용) → LISP- 시스템 프로그래밍 (지속적인 사용을 위해 효율성이 필요) → C- 웹 소프트웨어 → HTML, PHP, Java 프로그래밍 언어의 평가 기준Readability프로그램을 읽고 이해하기 쉬워야..

에버듀
'CS/프로그래밍언어론' 카테고리의 글 목록