파싱과 렉싱

파싱과 렉싱 (Parle 확장)

정규식(PCRE)만으로는 다루기 어려운 복잡한 데이터 형식을 분석해야 할 때, 파서(parser)와 렉서(lexer)를 직접 만들고 싶어질 때가 있어요. Parle 확장은 바로 그런 범용 렉싱·파싱 기능을 제공합니다.

출처: PHP 공식 매뉴얼 - Parsing and lexing (Parle)

본문

Warning — 이 확장은 EXPERIMENTAL(실험 단계) 입니다. 함수 이름을 포함한 동작이 향후 PHP 릴리스에서 예고 없이 바뀔 수 있고, 사용에 따른 위험은 사용자가 감수해야 합니다.

Parle 확장은 범용 렉싱과 파싱 기능을 제공해요. 구현은 특정 라이브러리를 기반으로 하며, C++14 호환 컴파일러가 필요합니다. 렉서는 정규식 매칭을 기반으로 하고, 파서는 LALR(1) 방식이에요. 렉서와 파서는 그때그때(on the fly) 생성되며, 완성된 뒤에는 즉시 사용할 수 있어요. Parle은 파싱·렉싱 자체와 그 데이터 구조 표현·처리를 담당하고, 직렬화(serialization)와 코드 생성은 아직 지원하지 않습니다.

렉싱과 파싱의 개념

렉서 분석은 문자 시퀀스를 렉시임(lexeme, 어휘 요소) 목록으로 쪼개는 과정이고, 그 렉시임 목록은 형식 문법에 대한 구문 분석(파싱)에 사용됩니다. 이 두 작업을 각각 렉싱(lexing)파싱(parsing) 이라고 불러요. 이 문서는 렉싱·파싱에 대한 완전한 정보를 제공하려는 게 아니고, 좋은 자료는 웹에 많으니 참고하면 돼요. Parle은 학습 목적이든 실제 활용이든 파싱·렉싱을 쓰려는 PHP 개발자에게 유용하며, 상태 기계와 문법 파싱을 손으로 구현할 필요가 없어요. 그 복잡한 일을 Parle이 처리해 주니까, 개발은 실제 문제 해결에 집중할 수 있습니다.

언제 쓰나요

Parle의 대표적인 사용처는 PCRE 정규식으로는 다루기 너무 복잡한 데이터 형식을 처리할 때예요. 특정 데이터 형식 처리, 기존 함수의 동작 수정, 나아가 자체 프로그래밍 언어 구현까지 활용 범위가 넓습니다.

생성된 상태 기계를 살펴보려면 Parle\Lexer::dump(), 생성된 문법을 확인하려면 Parle\Parser::dump() 같은 헬퍼 메서드가 유용해요. 파싱 동작을 추적하려면 Parle\Parser::trace()도 쓸 수 있습니다.

구성 요소

  • 설치/설정: Requirements, Installation, Predefined Constants
  • 패턴 매칭: Pattern matching
  • 예제: Lexer examples, Parser examples

클래스 일람

  • Parle\Lexeradvance, build, callout, consume, dump, getToken, insertMacro, push, reset
  • Parle\RLexer — 위 Lexer와 동일 메서드에 pushState 추가
  • Parle\Parseradvance, build, consume, dump, errorInfo, left, nonassoc, precedence, push, reset, right, sigil, sigilCount, sigilName, token, tokenId, trace, validate
  • Parle\RParser — Parser와 동일 메서드 제공
  • Parle\Stackpop, push
  • Parle\Token — 토큰 클래스
  • Parle\ErrorInfo — 오류 정보 클래스
  • Parle\LexerException — 렉서 예외
  • Parle\ParserException — 파서 예외

더 알아보기