Arithmetic Expression Evaluation

HNU CE 프로그래밍언어론 (2021년 1학기)

무지 간단한 산술식 값계산

  • 산술식  arithmetic expression
  • 값계산 evaluation
  • 교재 8.6절에서 다룬 논리식(Prop)의 값계산과 마찬가지 방식
  • Syntax 구문(론), 문법
  • Semantics 의미(론)

Syntax - 배경지식

  • 언어가 어떻게 생겨먹었는지 그 모양새
  • 노엄 촘스키(Noam Chomsky)의 문법(grammar) 유형 분류
    • Type-0 (UG 무제약문법)      - 재귀열거언어 - 튜링기계
    • Type-1 (CSG 문맥의존문법) - 문맥의존언어 - LBA
    • Type-3 (CFG 문맥자유문법) - 문맥자유언어 - LBA
    • Type-4 (RG 정규문법)          - 정규언어        - FA
  • 대부분 프로그래밍언어는 CFG중에서도 결정적(deterministic) CFG를 활용해 문법을 정의
  • 구체적 문법(concrete syntax) vs. 추상적 문법(abstract syntax)

Syntax, Grammar - 용어정리

  • 아니 syntax도 grammar도 '문법'이라고 ... ???
    • Java syntax - 자바 언어의 문법
    • context-free grammar - 문맥자유문법
  • Syntax: 언어의 모양새를 이루는 구조적 특징     [개념]
  • Grammar: 그런 특징을 정의(표현)하는 규칙들  [규정]
  • 그러니까 "syntax를 grammar로 정의(표현)한다"
    • 문법(syntax)을 문법규칙(grammar)으로 정의(표현)한다
    • 구문론(syntax)을 문법(grammar)으로 정의(표현)한다
  • ​주의: 다른 분야에서는 또 조금씩 다른 의미로 쓰일 수 있음에 유의!!

Syntax를 문법규칙으로 표기

변형생성문법규칙

Backus-Naur Form

<start> ::= <center>
                | <ab><center><ab>

<ab> ::= "a" | "b"

<center> ::= "c" | "d"

S \to C \mid ACA
A \to a \mid b
C \to c \mid d
  • non-terminal - 대문자, <...>
    (syntactic variable)
  • terminal         - 소문자, "..."

변형생성문법규칙

Backus-Naur Form

<Expr> ::= <Int> | <Name>
                | <Expr> "+" <Expr>

<Int> ::= ... ... ...

<Name> ::= ... ... ...

E \to I \mid N \\ \qquad \mid E + E
I \to \ldots
N \to \dots

산술식 Syntax를 문법규칙으로 표기

산술식 Syntax를 문법규칙으로 표기

\begin{array}{l} e \in \texttt{Expr} \\ e ::= n \\~\quad~~\mid x \\~\quad~~\mid e ~\pmb{\texttt{+}}~ e \\ \\ n \in \texttt{Int}\\ x \in \texttt{Name} \end{array}
data Expr
  = Const Int
  | Var   Name
  | Add   Expr Expr


type Name = String

Concrete Syntax

1 + (2 + 3)

Abstract Syntax

\begin{array}{l} e ::= n \mid x \mid e ~\pmb{\texttt{+}}~ e \\~\quad~~\mid \pmb{\texttt{(}} e \pmb{\texttt{)}} \end{array}
\begin{array}{l} e ::= n \mid x \mid e ~\pmb{\texttt{+}}~ e \\~\quad~~ \end{array}
1
2
3
+
+

문법분석

parsing

syntax analysis

Abstract Syntax

\begin{array}{l} e ::= n \mid x \mid e ~\pmb{\texttt{+}}~ e \\~\quad~~ \end{array}
1
2
3
+
+

Semantics (의미론)

프로그래밍언어의 의미를 표현하는 여러가지 방식의 의미론

  • Denotational semantics: 수학적 구조에 대응 
  • Axiomatic semantics: 실행 전후 논리적 조건
  • Operational semantics: 동작 과정을 기술
    • Small-step: 한 단계씩 진행 (중간 계산값 확인)
    • Big-step: 최종 결과값을 계산하는 과정에 집중

Small-step vs. Big-step

Small-step

Big-step

e \to e_1 \to e_2 \to ~\cdots~ \to v
e \twoheadrightarrow v
e \Downarrow v

컴파일러 정의에 적합 

인터프리터 정의에 적합 

산술식 언어의 동작 과정 의미론

Syntax

e ::= n \mid x \mid e ~\pmb{\texttt{+}}~ e

Semantics

~\sigma,e \Downarrow v~
   eval σ e
=> v
\{x\mapsto 3,\,y\mapsto 4\},\,x\,\pmb{\texttt{+}}\,y ~\Downarrow~ 7
   eval [("x",3),("y",4)] (Var "x" `Add` Var "y")
=> 7

산술식 언어의 동작 과정 의미론

Syntax

e ::= n \mid x \mid e ~\pmb{\texttt{+}}~ e

Semantics

~\sigma,e \Downarrow v~
\sigma \in \texttt{Env} ~ = ~ \texttt{Name} \xrightarrow{_\mathrm{fin}} \texttt{Value}
\sigma ::= \{ x_1\mapsto v_1, \ldots, x_k\mapsto v_k\}
v \in \texttt{Value} ~ = ~ \texttt{Int}

산술식 언어의 동작 과정 의미론

Syntax

e ::= n \mid x \mid e ~\pmb{\texttt{+}}~ e

Semantics

~\sigma,e \Downarrow v~
\sigma \in \texttt{Env} ~ = ~ \texttt{Name} \xrightarrow{_\mathrm{fin}} \texttt{Value}
\sigma ::= \{ x_1\mapsto v_1, \ldots, x_k\mapsto v_k\}
v \in \texttt{Value} ~ = ~ \texttt{Int}
\frac{}{\sigma,\,n \;\Downarrow\; n}
\frac{}{\sigma,\, x \;\Downarrow\; \sigma(x)}
\frac{\sigma,\,e_1\Downarrow\,v_1 \quad \sigma,\,e_2\Downarrow\,v_2}{\sigma,\,e_1\pmb{\texttt{+}}\,e_2 \;\Downarrow\; v_1\!+v_2}
e \in \texttt{Expr}
\{ x\mapsto 2, y\mapsto 3\}(x) = 2
\{ x\mapsto 2, y\mapsto 3\}(y) = 3

무지 단순한 산술식 언어

By 안기영 (Ahn, Ki Yung)

무지 단순한 산술식 언어

HNU CE 프로그래밍언어론 (2021년 1학기)

  • 615