정규식 언어를 구문 분석하려면 푸시 다운 오토마타가 필요합니까?


12

정규식을 입력 한 사용자를 NFA로 변환하여 일치하는 목적으로 문자열에 대해 NFA를 실행할 수 있습니다. 정규 표현을 구문 분석하는 데 사용할 수있는 최소 머신은 무엇입니까?

괄호가 존재한다는 것은 계산이 필요하고 DFA / NFA가 임의의 계산을 수행 할 수 없기 때문에 푸시 다운 오토 마톤이어야한다고 가정합니다. 이 가정이 맞습니까? 예를 들어, 식 a (bc *) d에는 괄호 안의 하위식이 올바르게 처리되도록 PDA가 필요합니다.


1
"구문 분석"이란 정확히 무엇을 의미합니까? 입력이 실제로 정규식인지 확인하거나 더 복잡한 것을 염두에 두어야합니까 (예 : 해당 NFA에 대한 설명을 출력하는 기계)? (입력이 실제로 정규식인지 확실하지 않고 확인해야하는 경우 괄호가 올 바르고 일반적으로 스택 사용을 의미하는지 확인할 수 있어야합니다.)
Kaveh

실용적인 답변을 위해, grep.y 에 대한 Plan 9 Grep 소스를 볼 수 있습니다.
Bruce Ediger

답변:


8

당신이 올바른지. 정규 표현식의 구문이 표준 기술을 사용하여 규칙적이지 않다는 것을 쉽게 알 수 있습니다.

REG(p)p

PDA를 직접 코딩하고 싶지는 않을 것입니다. ANTLR 또는 byacc 와 같은 파서 생성기를 사용하십시오 . 반면 파서를 직접 프로그래밍하여 언어 파싱을 조사하려면 CYK , Earley , 재귀 하강LR 과 같은 다른 기본 파싱 알고리즘을 계속 사용해야합니다 .


감사. 이러한 작업을위한 코드 작성은 더 나은 이해를 제공하며 lex, yacc, bison 등과 같은 기존 유틸리티만큼 효율적이지 않습니다.
Phil Wright

@ PhilWright : 알 겠어요! 이 경우에 대한 추가 포인터로 편집했습니다.
Raphael

나는 이것을 위해 손으로 코딩 된 재귀 강하 파서를 선호합니다.
Dave Clarke

이를 위해 파서를 직접 작성하는 경우 재귀 강하 (인수 분해 및 마사지 후)가 옵션 인 경우 C < sites.google.com/site/lccretargetablecompiler >에 대한 LCC 파서는 많은 연산자를 처리하는 데 흥미가 있습니다. 그러나 가장 쉬운 방법은 우선 구문 분석입니다.
vonbrand

3

cstheory에서 " 정규 표현식을 사용하여 정규 표현식 일치 "라는 질문에 대한 Jukka의 훌륭한 답변도 읽어 보시기 바랍니다 . 발췌 :

예를 들어, "압축 된"정규식 을 얻기 위해 다음과 같이 표준 표기법을 수정할 수 있습니다 .

  • ( 's 시퀀스로 구성된 접두사를 제거 할 수 있습니다.
  • )로 구성된 접미사를 제거 할 수 있습니다.

즉, ((a|b)*c)de(f|g)예를 들어 사용하여 "압축"표기법으로 표현 될 수있는 다음의 형식 중 하나 a|b)*c)de(f|g((a|b)*c)de(f|g또는 (a|b)*c)de(f|g).

[...]

정규 표현식의 "압축 된"표기법은 정규 언어입니다.

이것은 정규 표현 언어에 대한 흥미로운 "다른 견해"에 대한 링크 일뿐입니다. 아래 주석에서 밑줄로 표시된 것처럼 구문 트리를 작성하는 데 유용하지 않습니다. 파서를 직접 코딩하려면 codeproject " Writing-own-regular-expression-parser " 에 대한이 간단한 기사를 제안합니다 .


Jukka는 본질적으로 괄호의 균형을 유지해야한다는 요구 사항을 제거합니다. 나는 이것이 실제로 수행되는 곳을 알지 못하지만 의미를 변경함으로써 구문을 "단순화"할 수 있음을 주목할 가치가있다.
Raphael

4
당신 (그리고 Jukka)은 정규 표현식을 파싱하지 않고 인식합니다. "그렇습니다. (압축 된) 정규 표현식입니다."
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.