Grace
grace's dev_note
Grace
전체 방문자
오늘
어제
  • 분류 전체보기
    • FrontEnd
      • Next.js
      • React
      • ReactNativ..
      • Vue
    • Javascript
      • 러닝 자바스크립트
      • 모던 자바스크립트
    • CS
    • DataScienc..
      • Data Struc..
      • LeetCode
    • BackEnd
      • Express
      • Node.js
      • Nest.js
    • DevOps
      • Docker
    • 매일메일
    • 회고
    • 코드캠프

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • node.js
  • backend
  • Express
  • React Native
  • 알고리즘
  • vue-query
  • 번들러
  • Vue3
  • postgres
  • 자바스크립트
  • vitejs
  • PostgreSQL
  • nest.js
  • pinia
  • tanstack
  • Vue.js
  • 함수
  • javascript
  • Vite
  • Vue

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Grace

grace's dev_note

CS

[프로그래밍 언어론] 구문 분석

2023. 11. 23. 12:21

어휘 분석

  • 프로그램 분석: 문자 → (어휘 분석) → 어휘 → (구문 분석) → 구문
  • 어휘 분석
    • 어휘 분석의 목적: 프로그램에 사용되는 단어를 구별해 냄
    • 토큰: 어휘 분석을 통해 얻어지는 결과
    • 토큰과 렉심
      • 렉심(lexeme): 프로그램에 사용되는 단어
      • 토큰: 렉심의 집합
      • 예약어나 연산자 등 토큰과 렉심이 같은 경우가 많으므로 통상 렉심을 토큰이라고 부르기도 함
    • 식별자: 변수명, 함수명 등 이름을 나타내는 토큰
    • 예약어
      • 프로그래밍 언어 자체에 정의되어 포함된 토큰
      • 식별자와 구문 구조는 같지만 식별자로 쓸 수 없음(사용자 재정의 불가)

파스 트리

  • 유도(derivation)
    • 구문 규칙을 이용하여 주어진 프로그램을 만들어 내는 과정
    • 유도가 가능하면 문법적 오류가 없는 유효한 프로그램임
  • 파스 트리(parse tree)
    • 유도를 트리 형태로 나타낸 것
    • 구문 트리: 혹은 유도 트리라고 부르기도 함
    • 루트 노드: 시작 비단말 기호
    • 단말 노드: 왼쪽부터 오른쪽으로 차례로 나열하면 주어진 프로그램이 됨
    • 주어진 표현에 대한 파스 트리가 존재하면 구문에 부합하는 표현임
    • 주어진 표현에 대한 파스 트리가 존재하지 않으면 오류 있는 표현임

모호성

  • 파스 트리의 모호성
    • 주어진 표현에 대한 파스 트리가 존재하면 구문에 부합하는 표현임
    • 만약 주어진 표현에 대한 파스 트리가 여러 개 존재한다면
      • 구문론 관점: 파스 트리가 존재하므로 구문에는 부합
      • 의미론 관점: 주어진 표현이 서로 다른 의미로 해석될 수 있음
  • 모호한 문법
    • 동일한 표현에 대해 서로 다른 파스 트리가 만들어지는 문법
    • 모호한 문법의 문제점
      • 하나의 프로그램이 서로 다른 결과를 도출
      • 프로그래머의 의도와는 다르게 해석되어 잘못된 결과를 도출
  • 모호성 제거
    • 문법의 명확화
      • 의도하지 않은 의미로 해석되지 않도록 모호한 문법을 명확하게 변경
      • 모호성 제거를 위해 새로운 비단말 기호와 새로운 구문 규칙을 추가
    • 대표적인 예: 연산자 우선순위, 좌결합 연산자, 중첩된 if문의 else

연산자 우선순위

  • 덧셈과 뺄샘 < 곱셈과 나눗셈 < 괄호
  • 구문 규칙을 3개로 구분하고, 우선순위가 낮는 덧셈과 뺄셈 연산자부터 <exp>의 구문 규칙에 표현
// 모호한 문법
<exp> ::= <exp>+<exp> | <exp>-<exp>
	| <exp>*<exp> | <exp>/<exp>
	| (<exp>) | <digit>
<digit> ::= 0 | 1 | 2 | ... | 8 | 9
// 모호성이 제거된 문법
<exp> ::= <exp>+<exp> | <exp>-<exp> | <term>
<term> ::= <term>*<term> | <term>/<term> | <factor>
<factor> ::= (<exp>) | <digit>
<digit> ::= 0 | 1 | 2 | ... | 8 | 9

좌결합 연산자

  • 우선순위가 동일한 연산자 사이의 계산 순서는 왼쪽이 우선
  • 오른쪽 피연산자를 다음 높은 우선순위의 구문 규칙에서 정의하는 비단말 기호로 변경
// 모호한 문법
<exp> ::= <exp>+<exp> | <exp>-<exp> | <term>
<term> ::= <term>*<term> | <term>/<term> | <factor>
// 모호성이 제거된 문법
<exp> ::= <exp>+<exp> | <exp>-<exp> | <term>
<term> ::= <term>*<factor> | <term>/<factor> | <factor>

중첩된 if문의 else

  • 중첩된 if문에서 else문의 개수가 if문의 개수보다 적은 경우 각 else문을 어느 조건이 거짓일 때 수행해야 하는지 모호
  • 다른 else문과 짝이 되지 않은 가장 가까운 if문과 짝이 되도록 정함
  • 구문 규칙에서 else문 앞의 <문장>에는 if문과 else문이 짝인 경우만 가능하도록 변경
// 모호한 문법
<if문> ::= if <논리식> then <문장> else <문장>
	| if <논리식> then <문장>
<문장> ::= <if문> | ...
// 모호성이 제거된 문법
<if문> ::= if <논리식> then <문장2> else <문장>
	| if <논리식> then <문장>
<if문2> ::= if <논리식> then <문장2> else <문장2>
<문장> ::= <if문> | ...
<문장2> ::= <if문2> | ...

 

저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

[컴퓨터과학개론] 알고리즘  (1) 2023.11.30
[프로그래밍 언어론] 프로그래밍 언어의 구현  (1) 2023.11.30
[프로그래밍 언어론] 구문론과 의미론  (1) 2023.11.22
[프로그래밍 언어론] 프로그래밍 언어 패러다임  (1) 2023.11.22
[프로그래밍 언어론] 프로그래밍 언어의 발전 및 동작원리  (0) 2023.11.22
    'CS' 카테고리의 다른 글
    • [컴퓨터과학개론] 알고리즘
    • [프로그래밍 언어론] 프로그래밍 언어의 구현
    • [프로그래밍 언어론] 구문론과 의미론
    • [프로그래밍 언어론] 프로그래밍 언어 패러다임
    Grace
    Grace
    기술 및 회고 블로그

    티스토리툴바