
Syntax : 프로그램 안의 수식, 명령어와 프로그램 유닛 구조를 정한 것
Semantics: 의미를 정의
Sentence : syntax를 만족시키는 한 문장
language : sentence의 집합
lexeme : 언어가 허용하는 최소한의 단위
token : 하나의 lexeme은 하나의 token에 대응 (identifier 제외)
Recognizer : recognizer에 넣어서 인식되면 맞는 문장, 안되면 틀린 문장
Generators : generator에서 만들어지면 맞는 문장 안만들어지면 틀린 문장. 만들 수 있는 sentence는 모두 language이다
CFG: context free grammars
BNF는 CFG이다.
cfg는 논터미널을 대문자로, bnf는 꺽쇠로 표시
nonterminal → 대문자, terminal → 소문자
rule 의 LHS는 nonterminal로, RHS는 terminal과 nonterminal로 구성된다.
선택적 부분: [] 로 감싼다
한정된 범위의 택일: () 로 감싼다 → 무조건 하나 선택
0번 이상 반복: {} 로 감싼다
CFG로는 프로그래밍 언어의 모든 syntax 표현 불가
어떤 변수는 참조되기 전에 선언된 상태여야 한다 → BNF로 표현 불가CFG+Semantic rules, static semantics 중 하나
BNF로 표현하기 어려운 것을 위해 사용
- attribute values: BNF에서 쓰이는 각각의 symbol x에다가 A(x)라는 속성을 부여할 수 있음
- computation function: 각 속성을 정의 하기 위한 함수를 정할 수 있음
- predicate: 속성에 대한 명제를 정의하기 위한 predicate(서술부, 참이 되어야 하는 조건)를 줄 수 있음
Grammar
속성 종류
동작으로 의미를 표현 ⇒ 구현(코딩)
기계에 넣고 돌리면 기계가 다 보여줄 것이라는 방법. 100% 입증 가능, 확실한 방법이지만 (가능한 기법이긴 하지만) 너무 어려움.
기계에 넣고 돌리는 것: 하드웨어적 방법
virtual machine, interpreter : 소프트웨어적 방법
중간 단계 (불완전)→ 대안: simulator로 simulation (100%는 아니지만 대충 어렴풋이 보여줌)
이 방법은 적당히 추상화 했을 때만 좋음. 확실하게 만들기에는 너무 비싸거나 어려움
수학적 방법, 함수 사용
Functional programming language처럼 함수를 이용해 의미 표현, based on recursive function
x = y + z
if () ____ else _
expression assignment, selection문 등등 자체가 언어의 구성물 → 이걸 수학 요소 (function)으로 동작 표기
수학에서 함수는 variable의 값을 바꾸는 것. ⇒ 장점이자 단점: 프로그래밍언어로 작성된 동작을 variable로 표현해야 함.
variable은 모두 표현 가능하지만, variable로 표현할 수 없는 것은 표현 불가
⇒ 100% 이론적으로 구현 불가
모든 언어요소에 따른 mapping function을 만들어주는 것이 Denotational 방법
mapping function은 BNF에 대응
로직으로 의미 표현, 논리식 사용

- s1과 s2를 sequence로 실행하면 {P1}에서 {P3}으로도 실행 가능하다는 뜻