Perl 호환 정규 표현식은 어떤 언어를 인식합니까?


23

제목에서 알 수 있듯이 지난 주말 에는 패턴 내에서 임의의 코드를 실행할 수있는 일치 연산자를 제외하고 Perl 호환 정규 표현식과 일치하는 언어 클래스에 대해 생각하기 위해 몇 시간을 보냈습니다 .

당신이 무엇을 PCREs 모르는 경우, 읽어 보시기 바랍니다 .

문제는 인터넷에서 사용할 수있는 리소스가 컨텍스트가없는 언어에서 거의 멈추고 PCRE가 그보다 더 많이 일치 할 수 있다는 것입니다 (아래 참조). 그러나 나는 이런 종류의 것들에 대한 더 많은 이론이나 논문을 어디에서 찾을 수 있는지 정말로 모른다.

특히 : PCRE는 분명히 정규 언어의 상위 집합입니다 (PCRE 구문에는 모든 정규 언어 연산자가 있으므로).

모든 CFG는 Greibach 일반 형식으로 넣을 수 있으며 왼쪽 재귀를 제거합니다. (?(DEFINE)...)그룹을 통해 문법을 일치하는 서브 루틴으로 "번역"하고 왼쪽 재귀에 질식하지 않고 번역을 통해 사용할 수 있다고 생각합니다 .

  • 각 생산 헤드의 비 터미널은 서브 루틴이됩니다. (?<HEAD>...)
  • 각 생산의 본문은 서브 루틴에 배치됩니다. 터미널은있는 그대로두고 비 터미널은 프로 시저 호출이됩니다 (즉 (?&NONTERMINAL)).
  • 헤드와 동일한 비 터미널을 가진 모든 프로덕션은 |운영자 를 통해 OR로 연결됩니다 ( (?:...)필요한 경우 추가 그룹화 ).
  • 그런 다음 패턴은 (?(DEFINE)...)모든 "번역 된"프로덕션을 포함 하는 그룹 이되고 시작 문자열의 프로 시저를 호출하여 전체 문자열과 일치시킵니다. 즉^(?(DEFINE)...)(?&START)$

이것은 모든 CFG를 처리해야합니다. 따라서 PCRE는 모든 CFL과 일치 할 수 있어야합니다.

더 많은 것이 있습니다 : 간단한 언어 즉, 문자열의 언어가 두 번 반복되었습니다. 이 언어는 CFL이 아닙니다. CFL의 펌핑 보조는 실패합니다. ( 는 반드시 주의를 기울여야 하므로 두 반복되는 문자열의 시작 또는 끝을 펌핑 할 수는 없습니다.)| v x w | p

={|Λ}
|V엑스|

그러나이 언어는 PCRE와 쉽게 일치합니다 ^(.*)\1$. 따라서 우리는 CFL보다 엄격합니다.

얼마나 많이 요? 내가 말했듯이, 나는 모른다. CSL이나 다른 모든 클래스에 대한 자료를 찾지 못했습니다. 이것에 대해 논의 할 의사가 있습니까?

부록 : PCRE 구문의 어떤 부분 집합을 정확하게 지정해야하는지에 대한 질문을 받았습니다. 글의 시작 부분에 글을 쓸 때와 같이 패턴 내에서 임의의 코드를 실행할 수있는 연산자를 제외하고 싶었습니다 ??{}.

인수를 위해서, 우리는 pcresyntax (3) 매뉴얼 페이지에 의해 정의 된 구문을 고수 할 수 있다고 생각 합니다. 이것은 Perl 5.10-5.12가 제공하는 것의 합리적인 부분 집합입니다. 역 추적 제어 동사를 추가하거나 제거하면 인식 할 수있는 언어가 변경되지 않습니다. 그렇다면 어떤 클래스가 있거나없는 클래스를 알아내는 것이 좋습니다.


2
버전간에 변경되었으므로 선택한 PCRE 정의를 질문에 포함하십시오. 실제 Perl 정규 표현식은 임의의 Perl 코드를 포함 할 수 있으므로 Turing-complete가됩니다.
Gilles 'SO- 악마 그만해'10

끝에 메모를 추가했는데이 점이 더 명확 해지기를 바랍니다.
peppe

답변:


7

또한이 블로그 게시물이 매우 흥미로운 http://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html이라는 것을 발견했습니다 . 그것은 정규 표현식이 CFL ( DEFINE블록을 통해 문법을 다시 작성하여)을 인식한다는 사실 과 반복 문자열의 언어와 같은 일부 CSL을 인식한다는 사실에 대해 이전에 준 것과 동일한 증거를 제공합니다 . 역 참조가있는 정규 표현식이 NP-hard라는 증거를 제공합니다 (3-SAT를 정규 표현식으로 줄임).


2
저자가 "NP-complete"라고 말하면 "NP-hard"라고 말해야합니다. PCRE 언어 클래스가 NP에 포함되어 있다는 증거는 없습니다.
András Salamon 2016 년

사실, 의견에도 언급되어 있습니다.
peppe

5

그들은 대부분의 상황에 맞는 언어를 결정합니다. 이 펄 승려 게시물을 참조하십시오 .

기본적인 통찰은 머신의 "메모리"가 선형으로 묶인 캡처 ​​그룹의 수라는 것입니다.


5
두 번째 단락에서 제공하는 주장은 PCRE 가 CS보다 많은 것을 수용 할 수없는 이유를 설명 하지만이 포함이 정확한 이유는 아닙니다 (첫 번째 단락에서 제안). 연결된 기사도 그 증거를 제시 한 것처럼 보이지 않습니다.
Raphael

글쎄, 당신은 입력 문자열에있는 것 이상을 그룹화 할 수 없으며 그룹 수는 주어진 패턴으로 고정되어 있으므로 패턴이 사용하는 메모리에 대한 상한 (선형) 제한이 있습니다. 아직도, 나는 PCRE-> 선형 바운드 오토 마톤 변환의 공식적인 증거를 그리워한다.
peppe

네, 둘이 맞습니다. 답변을 수정했습니다.
Xodarap

이전 토론에 대해서는 perlmonks.org/?node_id=406253 도 참조하십시오 .
András Salamon 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.