문제

재귀적인 상승 파서는 어떻게 작동합니까? 나는 재귀를 썼습니다 하강 파서 스스로 파서이지만 LR 파서를 잘 이해하지 못합니다. 내가 뭐야 Wikipedia에서 발견되었습니다 내 혼란에만 추가되었습니다.

또 다른 질문은 왜 재귀 상승 파서가 테이블 기반 상대보다 더 많이 사용되지 않는지입니다. 재귀적인 상승 파서는 전반적으로 성능이 향상되는 것 같습니다.

도움이 되었습니까?

해결책

클래식 용 책 LR 파서의 작동 방식을 잘 설명합니다. 도 있습니다 구문 분석 기술. 실용 가이드. 내가 잘 기억한다면 당신이 그들에 대해 읽을 수있는 곳. Wikipedia (적어도 소개)의 기사는 옳지 않습니다. 그들은 Donald Knuth에 의해 만들어졌고, 그는 그의 컴퓨터 프로그래밍 책 5 권에 대해 설명합니다. 스페인어를 이해한다면, 책의 전체 목록이 있습니다. 여기 나에 의해 게시 됨. 모든 책이 스페인어로 된 것은 아닙니다.

그들이 어떻게 작동하는지 이해하기 전에 First, Follow 및 Lookahead와 같은 몇 가지 개념을 이해해야합니다. 또한 LR (Ascendant) 파서를 이해하기 전에 LL (후손) 파서의 개념을 이해하는 것이 좋습니다.

Parsers LR, 특별히 LR (K), SLR (K) 및 LALR (K) 패밀리가 있으며 여기서 K는 작업 해야하는 수가 몇 개입니다. YACC는 LALR (1) 파서를 지원하지만 이론에 근거한 것이 아니라 더 강력한 문법으로 작동하도록 조정할 수 있습니다.

성능에 대해, 그것은 분석중인 문법에 따라 다릅니다. 그들은 선형 시간에 실행되지만 필요한 공간 수는 최종 파서를 위해 얼마나 많은 주를 건설합니까?

다른 팁

개인적으로 기능 호출이 어떻게 더 빠를 수 있는지 이해하기가 어려워요. 테이블 조회보다 훨씬 "훨씬 더 빠른"것입니다. 그리고 Lexer/Parser가해야 할 다른 모든 것과 비교할 때 (주로 파일을 읽고 토큰 화) 할 때 "상당히 빠른"조차도 중요하지 않다고 생각합니다. 나는 Wikipedia 페이지를 보았지만 참조를 따르지 않았습니다. 저자는 실제로 완전한 Lexer/Parser를 프로파일 링 했습니까?

나에게 더 흥미로운 것은 재귀 하강과 관련하여 테이블 구동 파서의 감소입니다. 나는 YACC (또는 동등한)가 선택한 파서 생성기 인 C 배경에서 왔습니다. Java로 이사했을 때 Javacup (Javacup)과 여러 재귀 하강 구현 (Javacc, Antlr)을 찾았습니다.

답은 "C 대신 Java"의 답변과 비슷하다고 생각합니다. 실행 속도는 개발 속도만큼 중요하지 않습니다. Wikipedia 기사에서 언급 한 바와 같이, 테이블 구동 파서는 코드에서 이해하기가 거의 불가능합니다 (다시 사용했을 때 다시 행동 할 수는 있었지만 구식으로 문법을 재구성 할 수 없었을 것입니다). 재귀 적 출신은 비교할 때 매우 직관적입니다 (이는 약 20 년 동안 테이블 중심이되는 이유는 의심 할 여지가 없습니다).

재귀에 관한 Wikipedia 기사 오르막 구문 분석은 주제에 관한 원본 논문으로 보이는 것을 참조합니다 ( "매우 빠른 LR 파싱"). 그 종이를 훑어 보면 나에게 몇 가지가 깨끗해졌습니다. 내가 알아 차린 것들 :

  1. 이 논문은 어셈블리 코드 생성에 대해 이야기합니다. 대신 C 또는 Java 코드를 생성하는 경우 똑같은 일을 할 수 있는지 궁금합니다. 섹션 4 및 5, "오류 복구"및 "스택 오버 플로우 점검"을 참조하십시오. (나는 그들의 기술을 쫓아 내려고하지 않습니다 - 그것은 잘 작동 할 수 있습니다. 단지 그것이 당신이 커밋하기 전에보고 싶을 수도 있다고 말합니다.)

  2. 그들은 재귀 상승 도구를 자신의 테이블 구동 파서와 비교합니다. 결과 섹션의 설명에서 테이블 구동 파서가 "완전히 해석 된"것처럼 보입니다. 사용자 정의 생성 코드가 필요하지 않습니다. 전체 구조가 여전히 테이블 중심 인 중간지면이 있는지 궁금하지만 특정 작업에 대한 사용자 지정 코드를 생성하여 속도를 높입니다.

Wikipedia 페이지에서 언급 한 논문 :

테이블 인터넷 대신 코드 생성 사용에 대한 또 다른 논문 :

또한 재귀 사막 구문 분석은 LL 그래마 기반 언어를 구문 분석하는 가장 빠른 방법이 아닙니다.

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