현대 프로그래밍 언어에서 "Regex"가 실제로 "컨텍스트 민감한 문법"입니까?

StackOverflow https://stackoverflow.com/questions/612654

문제

수년에 걸쳐, "Regex"패턴 매칭은 내가 궁금해하는 시점에 점점 더 강력 해지고 있습니다. 실제로 상황에 감지하는 문법 일치입니까? 컨텍스트가없는 문법 일치의 변형/확장입니까? 지금은 어디에 있습니까? 왜 우리는 왜 오래되고 제한적인 "정규 표현"대신에 그것을 부르지 않습니까?

도움이 되었습니까?

해결책

특히 괄호를 캡처하는 데 대한 역약은 정규 표현을 규칙적, 상황에 맞지 않거나 상황에 맞는 문법보다 더 복잡하게 만듭니다. 이름은 단순히 역사적으로 자랐습니다 (많은 단어처럼). 또한보십시오 이번 장 Wikipedia와 이것 예제에 대한 설명 Perl에서.

다른 팁

내가보기 엔:

  • 일반 언어 :
    • 상태 기계와 일치합니다. 일치 할 문법의 현재 "위치"를 나타내는 데 하나의 변수 만 사용될 수 있습니다. 재귀를 구현할 수 없습니다.
  • 상황이없는 언어 :
    • 스택 머신과 일치합니다. 문법의 현재 "위치"는 하나 또는 다른 형태의 스택으로 표시됩니다. 전에 일어난 일을 "기억할 수 없습니다
  • 상황에 관계없이 언어 :
    • 대부분의 프로그래밍 언어
    • 모두 대부분의 인간 언어

나는 당신이 파서가 이미 겪은 무언가와 일치 할 수있는 정규 표현 파서에 대해 알고 있습니다.

그럼에도 불구하고 정규 표현 파서는 정교하지만 정교 할 수 있지만, 재귀적인 규칙 적용을 허용하지 않으며, 이는 상황이없는 문법에 대한 명확한 요구 사항입니다.

용어 성과선, 내 생각에, 대부분은 통사론 일반 문법 (별과 물음표)을 표현하는 데 사용됩니다.

현대의 정규 표현식 구현 기능이 있습니다. 고전적인 정규 표현 정의.

예를 들어 Microsoft의 .NET 밸런싱 그룹 (?<name1-name2> … ):

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

이것 하다 언어와 일치합니다 ₀₁ = {ε, 01, 0011, 000111,…}. 그러나이 언어는 정기적이지 않습니다 레마를 펌핑합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top