제목에서 알 수 있듯이 지난 주말 에는 패턴 내에서 임의의 코드를 실행할 수있는 일치 연산자를 제외하고 Perl 호환 정규 표현식과 일치하는 언어 클래스에 대해 생각하기 위해 몇 시간을 보냈습니다 .
당신이 무엇을 PCREs 모르는 경우, 읽어 보시기 바랍니다 이 와 이 .
문제는 인터넷에서 사용할 수있는 리소스가 컨텍스트가없는 언어에서 거의 멈추고 PCRE가 그보다 더 많이 일치 할 수 있다는 것입니다 (아래 참조). 그러나 나는 이런 종류의 것들에 대한 더 많은 이론이나 논문을 어디에서 찾을 수 있는지 정말로 모른다.
특히 : PCRE는 분명히 정규 언어의 상위 집합입니다 (PCRE 구문에는 모든 정규 언어 연산자가 있으므로).
모든 CFG는 Greibach 일반 형식으로 넣을 수 있으며 왼쪽 재귀를 제거합니다. (?(DEFINE)...)
그룹을 통해 문법을 일치하는 서브 루틴으로 "번역"하고 왼쪽 재귀에 질식하지 않고 번역을 통해 사용할 수 있다고 생각합니다 .
- 각 생산 헤드의 비 터미널은 서브 루틴이됩니다.
(?<HEAD>...)
- 각 생산의 본문은 서브 루틴에 배치됩니다. 터미널은있는 그대로두고 비 터미널은 프로 시저 호출이됩니다 (즉
(?&NONTERMINAL)
). - 헤드와 동일한 비 터미널을 가진 모든 프로덕션은
|
운영자 를 통해 OR로 연결됩니다 ((?:...)
필요한 경우 추가 그룹화 ). - 그런 다음 패턴은
(?(DEFINE)...)
모든 "번역 된"프로덕션을 포함 하는 그룹 이되고 시작 문자열의 프로 시저를 호출하여 전체 문자열과 일치시킵니다. 즉^(?(DEFINE)...)(?&START)$
이것은 모든 CFG를 처리해야합니다. 따라서 PCRE는 모든 CFL과 일치 할 수 있어야합니다.
더 많은 것이 있습니다 : 간단한 언어 즉, 문자열의 언어가 두 번 반복되었습니다. 이 언어는 CFL이 아닙니다. CFL의 펌핑 보조는 실패합니다. ( 는 반드시 주의를 기울여야 하므로 두 반복되는 문자열의 시작 또는 끝을 펌핑 할 수는 없습니다.)| v x w | ≤ p
그러나이 언어는 PCRE와 쉽게 일치합니다 ^(.*)\1$
. 따라서 우리는 CFL보다 엄격합니다.
얼마나 많이 요? 내가 말했듯이, 나는 모른다. CSL이나 다른 모든 클래스에 대한 자료를 찾지 못했습니다. 이것에 대해 논의 할 의사가 있습니까?
부록 : PCRE 구문의 어떤 부분 집합을 정확하게 지정해야하는지에 대한 질문을 받았습니다. 글의 시작 부분에 글을 쓸 때와 같이 패턴 내에서 임의의 코드를 실행할 수있는 연산자를 제외하고 싶었습니다 ??{}
.
인수를 위해서, 우리는 pcresyntax (3) 매뉴얼 페이지에 의해 정의 된 구문을 고수 할 수 있다고 생각 합니다. 이것은 Perl 5.10-5.12가 제공하는 것의 합리적인 부분 집합입니다. 역 추적 제어 동사를 추가하거나 제거하면 인식 할 수있는 언어가 변경되지 않습니다. 그렇다면 어떤 클래스가 있거나없는 클래스를 알아내는 것이 좋습니다.