✊ 필오의 개발일지
Back to Posts
2018년 6월 6일

렌더링 엔진(1) - 파싱과 DOM트리 구축

렌더링 엔진(1) - 파싱과 DOM트리 구축

https://d2.naver.com/helloworld/59361  를 읽고 정리했습니다.

  1. 브라우저의 주요 기능 
  2. 렌더링 엔진 동작 과정
  3. HTML 파싱 (for DOM 트리 구축)
  4. 렌더 트리 구축
  5. 렌더 트리 배치
  6. 렌더 트리 그리기

파싱과 DOM 트리 구축

  1. 파싱에 대하여  문법 / 파서-어휘 분석기 조합 / 변환 / 파싱 예 / 어휘와 구문에 대한 공식적인 정의 / 파서의 종류 / 파서 자동 생성
  2. HTML 파서 => DOM 트리  문맥자유문법이 아니다 / HTML DTD / DOM / 파싱 알고리즘 / 파싱이 끝난 이후의 동작 / 브라우저의 오류 처리
  3. CSS 파서 => CSSOM 트리 
  4. 스크립트와 스타일 시트의 진행 순서 

1. 파싱 일반

2 + 3 - 1

1-1. 문법

1-2. 파서-어휘 분석기 조합

자료를 유효한 토큰으로 분해하는 **어휘 분석기(lexical analysis)**가 있고, 언어 구문 규칙에 따라 문서 구조를 분석함으로써 파싱 트리를 생성하는 파서가 있다.

1-3. 변환 (컴파일!!)

1-4. 파싱 예

1-5. 어휘와 구문에 대한 공식적인 정의

어휘는 보통 정규표현식으로 표현한다.

INTEGER : 0|[1-9][0-9]* PLUS : + MINUS : -

구문은 보통 BNF  ( <기호> ::= <표현식>)라고 부르는 형식에 따라 정의한다.

expression := term operation term operation := PLUS | MINUS term := INTEGER | expression

문법이 문맥자유문법 (= 완전히 BNF 로 표현 가능한 문법)이라면, 언어는 정규 파서로 파싱할 수 있다.

1-6. 파서의 종류

1-7. 파서 자동 생성

파서 생성기 : 파서를 생성해 줄 수 있는 도구

웹킷


2. HTML 파서

HTML 파서는 HTML 마크업을 파싱 트리로 변환한다.

2-1. HTML 문법 정의

W3C 의 명세 

2-2. 문맥 자유 문법이 아님

2-3. HTML DTD (문석 형식 정의: Document Type Definition)

2-4. DOM (문서 객체 모델)

2-5. 파싱 알고리즘

HTML 은 일반적인 하향식 혹은 상향식 파서로 파싱이 안된다.

  1. 언어의 너그러운 속성
  2. 잘 알려져 잇는 HTML 오류에 대한 브라우저의 관용
  3. 변경에 의한 재파싱. 일반적으로 소스는 파싱하는 동안 변하지 않지만 HTML 에서 **document.write**을 포함하고 있는 스크립트 태그는 토큰을 추가할 수 있기 때문에 실제로는 입력 과정에서 파싱이 수정된다.

일반적인 파싱 기술을 사용할 수 없기 때문에 브라우저는 HTML 파싱을 위해 별도의 파서를 생성한다.


TL;DR


  1. byte stream decoder
  1. 토큰화
  1. 트리구축

(HTML 파싱 과정그림)

아래가 더 세분화된 과정

2-5-1. 토큰화 알고리즘

예시 >

<html> <body> Hello world </body> </html>

0.초기상태 : 자료 상태

<html> <body>

  1. 태그 열림 상태 : < 문자를 만나면 변함
  2. 태그 이름 상태 : a 부터 z 까지의 문자를 만나면 시작 태그 토큰생성 : >를 만날 때까지 유지한다. : 각 문자에는 새로운 토큰 이름이 붙는다. 이때 생성된 토큰은 html 토큰
  3. 자료 상태 : >문자에 도달하면 현재 토큰이 발행된다.

Hello world

  1. 문자 토큰 생성 발행
  2. <문자를 만날 때까지 진행

</body> </html>

  1. 태그 열림 상태
  2. 태그 이름 상태 : /문자는 종료 태그 토큰 생성
  3. 자료 상태 : >문자에 도달하면 현재 토큰이 발행된다.

2-5-2. 트리 구축 알고리즘

예시 >

<html> <body> Hello world </body> </html>

2-8. 파싱이 끝난 이후의 동작

2-9. 브라우저의 오류 처리

HTML 페이지에서 “유효하지 않은 구문”이라는 오류는 볼 수 없는데, 이는 브라우저가 모든 오류 구문을 교정하기 때문이다.

파서는 토큰화된 입력 값을 파싱하여 문서를 만들고 문서 트리를 생성한다. 때문에 파서는 적어도 다음과 같은 오류를 처리해야한다.

  1. 어떤 태그의 안쪽에 추가하려는 태그가 금지된 것일 때 일단 허용된 태그를 먼저 닫고 금지된 태그는 외부에 추가한다.
  2. 파서가 직접 요소를 추가해서는 안된다. 문서 제작자에 의해 뒤늦게 요소가 추가될 수 있고 생략 가능한 경우도 있다. HTML, HEAD, BODY, TBODY, TR, TD, LI 태그가 이런 경우에 해당한다.
  3. 인라인 요소 안쪽에 블록 요소가 있는 경우 부모 블록 요소를 만날 때까지 모든 인라인 태그를 닫는다.
  4. 이런 방법이 도움이 되지 않으면 태그를 추가하거나 무시할 수 있는 상태가 될 때까지 요소를 닫는다.

< 웹킷의 오류 처리하는 예 >

2-9-1. <br /> 대신 </br>

2-9-2. 어긋난 표

어긋난 표는 표 안에 또 다른 표가 th 또는 td 셀 내부에 있지 않은 것을 의미한다. 웹킷은 표의 중첩을 분해하여 형제 요소가 되도록 처리한다.

2-9-3. 중첩된 폼 요소

폼 안에 또 다른 폼을 넣은 경우 안쪽의 폼은 무시된다.

2-9-4. 태그 중첩이 너무 깊을 때

최대 20 개의 중첩만 허용하고 나머지는 무시한다.

2-9-5. 잘못 닫힌 html 또는 body 태그

깨진 html 을 지원한다. 일부 바보 같은 페이지는 문서가 끝나기 전에 body 를 닫아버리기 때문에 브라우저는 body 태그를 닫지 않는다. 대신 종료를 위해 end()를 호출한다.


DOM 트리는 문서 마크업의 속성 및 관계를 포함하지만 요소가 렌더링될 때 어떻게 표시될지에 대해서는 알려주지 않습니다. 이것은 CSSOM 의 역할.

3. CSS 파싱

3-1. 웹킷 CSS 파서

3-2. 브라우저별 사용자 에이전트 스타일


4. 스크립트와 스타일 시트의 진행 순서

4-1. 스크립트

4-2. 예측 파싱 (Speculative parsing)

4-3. 스타일 시트



참고링크

  1. https://d2.naver.com/helloworld/59361 
  2. https://developers.google.com/web 
  3. https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model?hl=ko 
  4. [WEBDIR] http://webdir.tistory.com/40 
  5. https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model?hl=ko 
Previous렌더링 엔진(2) - 렌더 트리 구축
Next브라우저와 렌더링 엔진

Related

© 2026 Felix