2011-01-24 7 views
9

구문 분석 기술은 CS 문헌에 잘 설명되어 있습니다. 그러나 내가 아는 알고리즘은 소스가 구문 적으로 정확해야합니다. 구문 오류가 발생하면 구문 분석이 즉시 중단됩니다.구문 오류가있는 코드 구문 분석

그러나 Visual Studio와 같은 IDE는 일반적으로을 입력하는 동안 의미있는 코드 완성 및 기타 힌트 을 제공 할 수 있습니다. 이는 구문이 유효한 상태가 아님을 의미합니다. 예 : 함수 호출에 여는 괄호를 입력하면 닫는 괄호가 입력 될 때까지 구문이 유효하지 않더라도 IDE는 함수에 대한 매개 변수 힌트를 제공합니다.

내 생각에 이것은 일종의 추측 또는 오류 허용 구문 분석기에 의존해야합니다. 누구든지이 기술에 사용 된 알고리즘이나 알고리즘을 알고 있습니까?

답변

1

Packrat는 유망한 것으로 알려졌으며 핵심 오류 지점에서 성공 또는 실패한 구문 분석 시도에 대한 정보를 제공합니다.이 정보는 스마트 오류보고, 완료, 힌트 등을 위해 복구되고 사용될 수 있습니다. 예를 들어, 커서가 모든 구문 분석 시도가 캐시에서 실패로 표시되는 지점에있는 경우 완료 옵션에 대해 시도한 토큰 목록을 제공 할 수 있습니다.

1

표준 트릭은 예측을 돕기 위해 구문 분석 기계를 사용하여 일종의 오류 복구를 수행하는 것입니다.

테이블 기반 파서 (예 : LALR 또는 GLR)의 경우 구문 오류가 발생하면 파서가 최근 오류가 발생하지 않은 상태입니다. 구문 분석 스택을 기록하여 각 시프트 이전에이를 기억할 수 있습니다 (또는 오류가 발생하기 전에 레코드를 줄이는 방법). 오류가 발생하면 저장된 스택의 구문 분석 상태를 검사하여 어떤 토큰이 다음에 올지를 결정할 수 있습니다 (구문 토큰으로 코드 완성을 수행하는 방법이기도 함). 보다 정교한 기술은 오류 토큰 또는 오류 토큰을 대체 할 수있는 가능한 최소의 트리를 사용하여 다음 순서로 시프트 할 수있는 가능한 최소의 토큰 시퀀스를 생성 할 수 있습니다.

예측을 만드는 많은 정보가 없기 때문에 이것은 재귀 적 파생 구문 분석기에서는 쉽지 않습니다. 오류 복구의 경우, 치명적인 트릭은 오류 복구 지점을 정의하고 (예 : "stmt"가 허용 될 수 있음) ";" 발견하고 "오류 stmt"받아들입니다. 코드 완성을 원하면 도움이되지 않습니다.