perl 또는 .NET과 같은 대부분의 최신 정규식 구현은 lookahead 및 lookbehind와 같은 기능을 가진 REGEX의 고전적인 컴퓨터 과학 정의를 뛰어 넘습니다. 이러한 기능을 통해 푸시 다운이 아닌 유한 오토 마톤으로 설명 할 수없는 문장을 구문 분석 할 수 있습니까? 튜링 완료에 얼마나 근접 할 수 있습니까?
perl 또는 .NET과 같은 대부분의 최신 정규식 구현은 lookahead 및 lookbehind와 같은 기능을 가진 REGEX의 고전적인 컴퓨터 과학 정의를 뛰어 넘습니다. 이러한 기능을 통해 푸시 다운이 아닌 유한 오토 마톤으로 설명 할 수없는 문장을 구문 분석 할 수 있습니까? 튜링 완료에 얼마나 근접 할 수 있습니까?
답변:
나는 실제 문제가 무한한 의미의 문제라고 생각하지 않습니다. 이것은 파싱의 다른 상황보다 나쁘지 않습니다.
문제는 역 참조의 특성화에 있습니다. 역 참조는 매우 강력하고 제한적입니다. 문맥이없는 언어를 허용하지 않고 문맥이없는 언어를 설명 할 수 있습니다. 예를 들어, 정규식 (a*)b\1b\1
은 형식 의 문자열과 일치 하며, 펌핑 보조를 사용하여 이것이 문맥이없는 언어가 아님을 표시 할 수 있습니다. 그러나 역 참조가있는 정규식은 균형이없는 괄호 언어 인 프로토 타입 컨텍스트가없는 언어와 일치하기에 충분하지 않은 것 같습니다.
정규식에 대한 언어로 된 문자열을 말하는 의미 론적 의미를 부여하는 것은 쉽지만, 우수한 오토마타 이론적 특성을 부여하는 것은 훨씬 더 어려워 보입니다. 레지스터의 입력 문자열을 복사 할 수 있고 현재 문자열을 테스트하는 데 사용할 수 있지만 레지스터를 수정할 수있는 레지스터 머신과 같은 것입니다.
유한 모델 이론을 수행하는 사람들은 많은 펑키 머신 모델을 가지고 있으며 이것이 자신의 모델에 해당하는지 아는 것은 흥미로울 것입니다.
이 질문에 대답하는 문제는 실제 구현에서 "언 바운드"라는 개념을 포착하는 것입니다. 예를 들어, 정규 표현식 /(.*)\1/
은 언어 없는 상황 무료입니다. 실제로 사용 된 스택에 제한이있을 수 있습니다 (예를 들어, w 는 일부 K 보다 길 수 없습니다 ). 이는 언어를 효과적으로 L K = { w w | w ∈ Σ ∗ , ∣ w ∣ ≤ K }고정 의 정규식입니다.
그러나 원칙적으로 지정된 관련 정규 표현식은 일반 언어보다 강력합니다. 이 관련 질문 은 (예를 들어 멋진 예를 통해) 훨씬 자세하게 설명합니다.
Suresh Venkat과 연결되어있는 이 다른 질문 에서 얻은 한 가지 흥미로운 결과 는 "실용적인"정규 표현식이 NP- 완료되므로 SAT와 동등한 수준이어야한다는 것입니다.
비전문가이기 때문에 직관적으로 "역 참조가있는 정규식이 균형 괄호 언어와 일치하기에 충분하지 않은 것 같습니다"라는 데 동의하지만 이상한 일이 있습니다. NP- 완전성은 NP 문제가 다항식으로 정규 표현식으로 축소 될 수 있음을 의미하므로 아마도 "균형 괄호"언어에서 정규 표현식으로 인식 할 수있는 언어로 다항식 감소가있을 수 있습니다. 그러나 다시 말하지만 CFL을 구문 분석하는 터무니없는 정규 표현식이있을 수 있습니다.
아마도 교훈은 복잡성 클래스와 언어 클래스는 일반적으로 비교할 수 없다는 것입니다. 또한 "복잡성 척도"가 아닌 Chomsky 계층 구조를 참조하여 질문을 표현하는 것이 좋습니다 (공평하더라도, 나는 그것에 혼동되지 않았습니다).
찰스 스튜어트의 글을 참고하세요 :
Aho, 1990, "문자열에서 패턴을 찾기위한 알고리즘"은 역 추적이있는 일반 언어의 멤버쉽 문제가 NP 완료임을 보여줍니다.
289 페이지의 Google 도서 에서 부분 미리보기 (적어도 진술 문)를 찾을 수 있으며 논문에 대한 참고 문헌은 여기 에서 찾을 수 있습니다 . 이 백서에서 rewbr은 정규식 포함 역 참조를 나타냅니다.
가장 일반적인 "정규 표현식"구현 인 PCRE는 역 참조를 넘어 재귀 패턴을 구현합니다. 그들의 복잡성에 대한 질문 은 Stackoverflow에서 방금 요청되었습니다 . Perl guru brian d foy의 실질적인 답변에 따르면 PCRE는 문맥없는 문법만큼 강력합니다. 그러나이 구문은 Backus-Naur Form에 비해 끔찍합니다.