순진 버전은 원래 문법의 각 규칙 수정이 추상에서 작동하지만
LHS = RHS1 COMMENTS RHS2 COMMENTS ... COMMENTS RHSN ;
를,이 가능성이 경우 파서 생성기를 망치는 것 그것은 LL 또는 LALR 기반입니다. 왜냐하면 이제는 다음 토큰으로 무엇을 할 것인지 결정하기에 앞서 충분히 멀리 볼 수 없기 때문입니다. 따라서 GLR과 같은보다 강력한 파서 생성기로 전환해야합니다.
는 스마트 버전 (만) 모든 터미널 T 비 터미널로 대체합니다
T = COMMENTS t ;
및 수정합니다 orginal 한 렉서에 trivally 개의 발광 t 당신은 여전히 내다 트러블이 대신 T.의.
하지만 이는 실제 솔루션을 제공합니다.
더 복잡한 버전은 렉서가 토큰 앞에있는 주석을 수집하여 토큰이 다음 토큰에 첨부하도록하는 것입니다. 본질적으로, 우리는 렉서에서 문법의 종단 규칙 수정을 구현하고 있습니다.
파서 (기술을 변경할 필요가 없음)는 원래 본 토큰을 보았습니다. 토큰은 주석을 주석으로 전달합니다. 주석을 이전 토큰에 첨부하는 주석과 다음 토큰에 첨부하는 주석으로 나누는 것이 유용 할 수 있지만, 실제적인 방법을 결정할 수 없기 때문에 휴리스틱 스보다 더 훌륭하게 만들 수는 없습니다 토큰에 실제로 속하는 토큰.
토큰 및 주석에 대한 위치 정보를 캡처하여 원본 텍스트를 재생성하는 방법 ("적절한 위치의 주석")을 찾는 것이 재미있을 것입니다. 언어 구문 규칙을 어 기지 않는 방식으로 적절한 기수 값, 문자열 이스케이프 등을 사용하여 실제로 텍스트를 다시 생성하는 것이 더 재미있을 것입니다.
우리는 일반적인 언어 처리 도구로이를 수행하며 적절하게 작동합니다. 모든 작업을 직선으로 처리하는 것이 얼마나 많은 작업 일지, 변환 작업에 집중할 수 있습니다. 사람들은 이것을 많이 과소 평가합니다.
나는 당신이 달성하기를 원하는 것을 그리는 데 어려움을 겪고있다. - 그 외에, 주석 구분자를 무시하도록 렉서를 수정하면 나는 생각하는 코드처럼 주석을 분석 할 것이다. – fvu
@fvu 나는 렉서를 수정하고 싶지 않다고 생각한다.파서의 내부 구조에 주석을 달기를 원한다. 그래서 나는이 프로젝트에서도'stringify (AST) '를 호출하면 트리에 중첩 된 적절한 위치에 주석을 재현 할 것이다. . 그러나 나는이 문제가 진정으로 희망만큼이나 확실한 것인지 확신하지 못한다. – BlackVegetable