그렇다면 HTML 파서는 어떻게 작동합니까? 정규식을 사용하여 구문 분석하지 않습니까?
음 ... 아니.
당신의 두뇌에서 계산 이론으로 되돌아 가면, 하나를 수강했거나, 컴파일러 코스 또는 이와 유사한 것을 수강했다면, 다른 종류의 언어와 계산 모델이 있다는 것을 기억할 것입니다. 모든 세부 사항을 다룰 자격은 없지만 몇 가지 주요 사항을 함께 검토 할 수 있습니다.
(이러한 목적을위한) 가장 간단한 유형의 언어 및 계산은 일반 언어입니다. 정규 표현식으로 생성 할 수 있으며 유한 오토마타로 인식 할 수 있습니다. 기본적으로 이는 이러한 언어의 "파싱"문자열이 상태를 사용하지만 보조 메모리는 사용하지 않음을 의미합니다. HTML은 확실히 일반 언어가 아닙니다. 생각해 보면 태그 목록이 임의로 깊이 중첩 될 수 있습니다. 예를 들어 테이블에는 테이블이 포함될 수 있고 각 테이블에는 많은 중첩 태그가 포함될 수 있습니다. 정규식을 사용하면 한 쌍의 태그를 선택할 수 있지만 임의로 중첩 된 것은 없습니다.
규칙적이지 않은 고전적인 단순 언어는 괄호와 올바르게 일치합니다. 시도해보십시오. 항상 작동하는 정규식 (또는 유한 오토 마톤)을 만들 수 없습니다. 중첩 깊이를 추적하려면 메모리가 필요합니다.
메모리 용 스택이있는 상태 머신은 컴퓨팅 모델의 다음 강점입니다. 이를 푸시 다운 자동화라고하며 문맥없는 문법에 의해 생성 된 언어를 인식합니다. 여기에서 정확하게 일치하는 괄호를 인식 할 수 있습니다. 실제로 스택은이를위한 완벽한 메모리 모델입니다.
이게 HTML에 충분할까요? 안타깝게도 아닙니다. 실제로 모든 태그가 항상 완벽하게 정렬되는 엄청나게 신중하게 검증 된 XML의 경우 일 수 있습니다. 실제 HTML에서는 <b><i>wow!</b></i>
. 이것은 분명히 중첩되지 않으므로 올바르게 구문 분석하기 위해 스택은 충분히 강력하지 않습니다.
다음 수준의 계산은 일반 문법에 의해 생성되고 튜링 머신에서 인식되는 언어입니다. 이것은 일반적으로 가장 강력한 계산 모델로 받아 들여집니다. 보조 메모리가있는 상태 머신은 어디에서나 메모리를 수정할 수 있습니다. 이것이 프로그래밍 언어가 할 수있는 일입니다. 이것은 HTML이 존재하는 복잡성의 수준입니다.
여기에 모든 것을 한 문장으로 요약하려면 일반 HTML을 구문 분석하려면 정규식이 아닌 실제 프로그래밍 언어가 필요합니다.
HTML은 다른 언어가 파싱되는 것과 같은 방식으로 파싱됩니다 : 렉싱과 파싱. 렉싱 단계는 개별 문자의 흐름을 의미있는 토큰으로 나눕니다. 구문 분석 단계는 상태와 메모리를 사용하여 토큰을 논리적으로 일관된 문서로 조합하여 처리 할 수 있습니다.