작동하는 알고리즘을 설명하겠습니다. 실행 시간이 너무 나쁘지 않아야합니다. 이것도 꽤 미리 계산할 수 있습니다.
나는 것으로 가정합니다 (아마 쉽게 그 경우에 적응 비록) 비끝을 포함하지 않는 당신이 모르는 , 또는 유도 . 또한 문법에는 파생에서 사용되지 않은 프로덕션이 포함되어 있지 않다고 가정합니다 ( 예 : ).x yaxyA → AaA→A
주요 문제는 정말 구문 분석하는 것입니다 당신은 당신이 결국 국가의 종류 알고 싶어 당신이 따를 수있는 것을 알 수 있도록, . 모르는 것처럼 쉽지 않습니다 .Xaax
우리는 Earley 알고리즘 의 적응을 사용합니다 . 그 알고리즘을 먼저 이해하고 싶을 것입니다. 우리의 알고리즘은 초기화와 완료 단계가 다르다는 것을 제외하고는 거의 같은 방식으로 작동합니다.
초기화를 들어, 우리는 모든 발생에 대한 Earley의 항목을 가지고있는 우리의 첫 번째 세트 씨앗 (의 첫 번째 문자 문법의 생산에). 이 항목의 뒷면 포인터를 유효하지 않은 값인 -1로 설정했습니다. 이것은 수정 된 완성에서 중요합니다. 기본적으로 -1은 '이 생산이 어디서 시작되었는지 전혀 모른다'를 의미합니다.a1a
이제 가능한 초기 Earley 항목마다 Earley 알고리즘을 개별적으로 수행합니다. 구문 분석이 서로 방해 할 수 있으므로 단순히 동시에 모든 작업을 수행 할 수는 없습니다. 역 추적보다 빠른 방법을 쉽게 볼 수 없습니다.
완료 단계에서는 -1 백 포인터를 처리하도록 수정해야합니다. 출처를 모르는 제작을 완료함에 따라 어려움에 처해 있습니다. 그러나, 이 방법은 계산하는 데 사용 내다 세트LALR(1) 로 Pennello 및 DeRemer은 우리를 구원 : 우리가 여기에서 필요로하는 것은 정확히입니다 내다 설정합니다. 이러한 미리보기 세트의 모든 항목은 문법에서 해당 위치를 가지며, 이는 완성 된 생산의 가능한 연속에 해당합니다. L A L R ( 1 )LALR(1)
불행히도, 나는 다시 여기로 다시 되돌아가는 것 외에 다른 선택을 보지 못합니다. 미리보기 세트의 모든 위치에 대해이 위치에서 완료 단계를 수행하고 그 위치에서 구문 분석을 계속하십시오. 모든 구문 분석마다 별도로이 작업을 수행하십시오. 문법이 경우 미리보기는 이동해야 할 위치를 고유하게 결정하므로 역 추적 할 필요가 없습니다.LALR(1)
당신은 넘어 위의 알고리즘을 하나의 문자 계속 언제 마지막 스캐너 위상 발견 뭔가를 - 당신이 여분을 고려, 가상 캐릭터가 바로 당신에게 '추적'을 제공하는 '모든 문자'로 당신이 찾고있는 세트 이 문자를 답변 세트에 추가 할 수 있습니다.a
편집 : 역 추적에 의해 도입 된 대부분의 오버 헤드를 제거하는 방법을 찾았습니다. 우리는 이러한 식별자의 접두사를 사용해야하므로 모든 Earley 항목과 일련의 식별자 (문자열)를 연결합니다. 초기화시 모든 초기 항목을 Earley 세트에 추가하고 고유 식별자를 모든 세트와 연관시킵니다.
스캐너 및 예측 변수 단계에서 식별자가 새 항목으로 전달됩니다. 식별자 만 다른 동일한 Earley 세트의 Earley 항목은 식별자를 병합하여 병합됩니다. 모든 식별자에 대해이 단계를 별도로 수행하지 않고도 식별자가있는 이러한 새 항목에 대해 스캐너 및 예측 변수 단계를 수행 할 수 있습니다.
완료자는 식별자를 개별적으로 고려하고 이전 항목 세트의 해당 항목에 식별자의 접 두부 인 식별자가있는 경우에만 항목을 완료합니다. 가능한 모든 완성에 대해 ( lookahead set 의 모든 항목에 대해 ) 완성 된 항목의 식별자에 고유 한 문자를 추가합니다.LALR(1)
기본적으로 이러한 식별자를 사용하여 역 추적을 수행하므로 스캐너 및 예측 단계에서 이중 작업을 수행하지 않습니다.