왜 렉싱과 파싱을 분리해야합니까?


15

상태 머신에서 단일 패스를 사용하여 문서를 구문 분석 할 수 있습니다. 두 번 통과하면 어떤 이점이 있습니까? 텍스트를 토큰으로 변환 할 수있는 어휘 분석기가 있고 해당 토큰에 대한 생산 규칙을 ​​테스트 할 파서가 있습니까? 텍스트에 직접 제작 규칙을 적용하는 단일 패스가없는 이유는 무엇입니까?



2
이것은 lexer + parser의 표현력 에 대한 답변으로 많은 기술적 인 의견과 함께 CS, stackexchange에 대해 이미 논의되었습니다 . 그러나 추가 답변을위한 여지가있을 수 있습니다.
babou

파이프 라인 스타일의 병렬 처리 (불균형 단계 임)가 부수적 인 이점인지 궁금합니다. 명령 및 데이터 캐시 동작도 흥미로울 수 있습니다. 컴파일 시간을 줄일 수있는 정도는 특정 하드웨어에 따라 다릅니다.
Paul A. Clayton

꽤나 명백한 이유 중 하나는 스캐너 도구를 별도로 사용할 수 있다는 것입니다. 실제로, 나는 종종 flex를 사용하여 입력을 스캔하지만, yacc의 완전한 힘을 거의 필요로하지 않는다.
jamesqf

답변:


13

그것들을 분리 할 필요는 없습니다. 사람들은 그것들을 스캐너없는 파서 로 결합합니다 .

스캐너가없는 파서의 주요 단점은 결과 문법이 다소 복잡하다는 것인데, 이는 렉싱을 수행하는 정규식과 토큰 스트림에서 구문 분석을 수행하는 컨텍스트없는 문법의 조합보다 복잡합니다. 특히, 스캐너가없는 구문 분석을위한 문법은 애매 모호한 경향이 있습니다. 토큰 스트림에서 작업하는 문법에 대한 모호성을 제거하는 것이 더 쉽습니다.

전용 사전 렉싱 단계를 사용하는 데 따른 실용적인 이점은 후속 파서를 사전 어휘와 결합하지 않는다는 것입니다. 어휘 및 구문 세부 사항이 여전히 자주 변경되는 초기 프로그래밍 언어 개발 중에 유용합니다.


1

@babou 네 맞습니다. LL (k)로 구성된 정규 표현식 형식의 공식 결과가 LL (k) 또는 이와 유사한 형식으로 나오는지 알 수 없습니다. 더욱이, 어휘는 보통 정규 언어로 수행되는 것이 아니라보다 강력한 것, 즉 가장 긴 일치 및 키워드 우선 순위로 확장 된 정규 언어로 수행됩니다. 정확한 언어 클래스와 해당 클로저 속성이 무엇인지 잘 모르겠습니다.
Martin Berger

2
룩어 헤드가 식별자를 읽는 것을 포함하는 경우, 원칙적으로 식별자의 길이에 바운드가 없기 때문에 컴포지션에는 무제한 룩어 헤드가 필요합니다.
babou

@babou 확실하지 않습니다. 가장 긴 키워드의 길이가 17자인 경우 더 긴 문자열은 식별자이거나 어휘 적으로 유효하지 않아야합니다.
Martin Berger

그러나 식별자 또는 문자열, 숫자 또는 기타 리터럴은 실제로 필요한 토큰 앞에있을 수있는 17 개 이상의 개별 기호 시퀀스입니다. 그것은 한없이 앞서가는 큰 예견입니다. 비 결정적 언어로 끝날 수 있습니다.
babou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.