2009-03-04 5 views

답변

9

특히 괄호 캡처에 대한 역 참조는 정규식, 문맥 자유형 또는 상황 별 문법보다 더 복잡한 표현식을 만듭니다. 이름은 단순히 역사적으로 (많은 단어로) 재배됩니다. 위키피디아의 this section과 펄의 explanation with an example도 참조하십시오.

+0

'정규 언어'와 '정규 표현식'의 차이점을 설명해 주시겠습니까? –

+1

CSG보다 훨씬 강력합니까? 예를 들어 주시겠습니까? – notnot

+0

일반 언어는 일반 문법 (http://en.wikipedia.org/wiki/Regular_grammar 참조)으로 설명 할 수 있지만 정규 표현은 덜 제한적이어서 처리하기가 더 복잡한 패턴 일치 언어입니다. –

3

내가보기 :

  • 정규 언어 :
    • 상태 머신에 의해 일치. 하나 개의 변수는 일치하는 문법의 현재 "위치"를 나타내는 데 사용할 수 있습니다 : 재귀는
    • 구현 될 수
  • 문맥 자유 언어 : 스택 기계에 의해 일치
    • . 문법의 현재 "위치"는 하나 또는 다른 형식의 스택으로 표현됩니다. 모든 대부분의 인간의 언어
  • 나는 일반의

알고

  • 대부분의 프로그래밍 언어
  • :
  • 상황에 맞는 언어 이전에 발생한 아무것도 "기억"할 수 없습니다 파서가 이미 접했던 무언가와의 조화를 가능하게하는 표현 파서 nsitive 문법.

    여전히 정교한 문법 파서는 규칙을 재귀 적으로 적용 할 수 없으므로 문맥 자유 문법에 대한 확실한 요구 사항입니다.

    용어 정규식은, 내 의견으로는, 주로 그 일반 문법 (별과 물음표)를 표현하는 데 사용되는 구문을 의미합니다.

  • +0

    Lookahead/lookbehind와 명명법은 표준 정규 표현식 - 메모리 외부에있는 것을 확실히 추가합니다. PDA 수준이 아니니? – notnot

    +1

    자연 언어가 문맥에 민감하다는 것은 사실이 아닙니다. http://www.eecs.harvard.edu/~shieber/Biblio/Papers/shieber85.pdf –

    +0

    아, 그게 좋은 물건입니다. – notnot

    3

    classic regular expression definition의 규칙을 위반하는 최신 정규 표현식 구현의 기능이 있습니다. 예를 들어 Microsoft’s .NET Balancing Group(?<name1-name2> …)

    :

    ^(?:0(?<L>)|1(?<-L>))*(?(L)(?!))$ 
    

    가 수행이 언어 L 일치 ₀₁ = {ε , 01, 0011, 000,111, ...}. 그러나이 언어는 Pumping Lemma에 따르면 규칙적이지 않습니다.

    +0

    그것이 고전적인 정규 표현식을 넘어서지만, 나는 훨씬 더 궁금해. 위의 Fabian의 링크는 흥미 롭습니다. – notnot

    관련 문제