정규식을 입력 한 사용자를 NFA로 변환하여 일치하는 목적으로 문자열에 대해 NFA를 실행할 수 있습니다. 정규 표현을 구문 분석하는 데 사용할 수있는 최소 머신은 무엇입니까?
괄호가 존재한다는 것은 계산이 필요하고 DFA / NFA가 임의의 계산을 수행 할 수 없기 때문에 푸시 다운 오토 마톤이어야한다고 가정합니다. 이 가정이 맞습니까? 예를 들어, 식 a (bc *) d에는 괄호 안의 하위식이 올바르게 처리되도록 PDA가 필요합니다.
정규식을 입력 한 사용자를 NFA로 변환하여 일치하는 목적으로 문자열에 대해 NFA를 실행할 수 있습니다. 정규 표현을 구문 분석하는 데 사용할 수있는 최소 머신은 무엇입니까?
괄호가 존재한다는 것은 계산이 필요하고 DFA / NFA가 임의의 계산을 수행 할 수 없기 때문에 푸시 다운 오토 마톤이어야한다고 가정합니다. 이 가정이 맞습니까? 예를 들어, 식 a (bc *) d에는 괄호 안의 하위식이 올바르게 처리되도록 PDA가 필요합니다.
답변:
당신이 올바른지. 정규 표현식의 구문이 표준 기술을 사용하여 규칙적이지 않다는 것을 쉽게 알 수 있습니다.
PDA를 직접 코딩하고 싶지는 않을 것입니다. ANTLR 또는 byacc 와 같은 파서 생성기를 사용하십시오 . 반면 파서를 직접 프로그래밍하여 언어 파싱을 조사하려면 CYK , Earley , 재귀 하강 및 LR 과 같은 다른 기본 파싱 알고리즘을 계속 사용해야합니다 .
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 " 에 대한이 간단한 기사를 제안합니다 .