2013-07-10 2 views
4

나는 github의 Zach Carter의 reflect.js (좋은 자바 파서 파서)로 작업하고 있습니다. 그의 파서의 동작을 수정하여 일반 토큰처럼 주석을 처리하려고합니다. 다른 토큰처럼 구문 분석되어야합니다. reflect.js의 기본 동작은 모든 주석을 추적하고 (렉서가 토큰으로 잡아서) 작성한 AST (추상 구문 트리)의 끝에 주석 목록을 추가하는 것입니다.덧글에 대한 문법 규칙

그러나이 주석을 AST에 그대로 포함하고 싶습니다. 나는이 변화가 문법 규칙을 grammar.y 파일 here에 추가하는 것을 포함 할 것이라고 믿는다. 현재 의견에 대한 규칙이 없습니다. 내 이해가 정확하면 주 파싱 코드에서 무시되는 이유입니다.

AST에 주석을 포함하는 규칙은 어떻게 작성합니까?

 LHS = RHS1 RHS2 ... RHSN ; 

가 될 :

+0

나는 당신이 달성하기를 원하는 것을 그리는 데 어려움을 겪고있다. - 그 외에, 주석 구분자를 무시하도록 렉서를 수정하면 나는 생각하는 코드처럼 주석을 분석 할 것이다. – fvu

+0

@fvu 나는 렉서를 수정하고 싶지 않다고 생각한다.파서의 내부 구조에 주석을 달기를 원한다. 그래서 나는이 프로젝트에서도'stringify (AST) '를 호출하면 트리에 중첩 된 적절한 위치에 주석을 재현 할 것이다. . 그러나 나는이 문제가 진정으로 희망만큼이나 확실한 것인지 확신하지 못한다. – BlackVegetable

답변

3

순진 버전은 원래 문법의 각 규칙 수정이 추상에서 작동하지만

 LHS = RHS1 COMMENTS RHS2 COMMENTS ... COMMENTS RHSN ; 

를,이 가능성이 경우 파서 생성기를 망치는 것 그것은 LL 또는 LALR 기반입니다. 왜냐하면 이제는 다음 토큰으로 무엇을 할 것인지 결정하기에 앞서 충분히 멀리 볼 수 없기 때문입니다. 따라서 GLR과 같은보다 강력한 파서 생성기로 전환해야합니다.

는 스마트 버전 (만) 모든 터미널 T 비 터미널로 대체합니다

 T = COMMENTS t ; 

및 수정합니다 orginal 한 렉서에 trivally 개의 발광 t 당신은 여전히 ​​내다 트러블이 대신 T.의.

하지만 이는 실제 솔루션을 제공합니다.

더 복잡한 버전은 렉서가 토큰 앞에있는 주석을 수집하여 토큰이 다음 토큰에 첨부하도록하는 것입니다. 본질적으로, 우리는 렉서에서 문법의 종단 규칙 수정을 구현하고 있습니다.

파서 (기술을 변경할 필요가 없음)는 원래 본 토큰을 보았습니다. 토큰은 주석을 주석으로 전달합니다. 주석을 이전 토큰에 첨부하는 주석과 다음 토큰에 첨부하는 주석으로 나누는 것이 유용 할 수 있지만, 실제적인 방법을 결정할 수 없기 때문에 휴리스틱 스보다 더 훌륭하게 만들 수는 없습니다 토큰에 실제로 속하는 토큰.

토큰 및 주석에 대한 위치 정보를 캡처하여 원본 텍스트를 재생성하는 방법 ("적절한 위치의 주석")을 찾는 것이 재미있을 것입니다. 언어 구문 규칙을 어 기지 않는 방식으로 적절한 기수 값, 문자열 이스케이프 등을 사용하여 실제로 텍스트를 다시 생성하는 것이 더 재미있을 것입니다.

우리는 일반적인 언어 처리 도구로이를 수행하며 적절하게 작동합니다. 모든 작업을 직선으로 처리하는 것이 얼마나 많은 작업 일지, 변환 작업에 집중할 수 있습니다. 사람들은 이것을 많이 과소 평가합니다.

+0

첫 번째 접근 방식은 내가 생각해 냈지만 너무 처리하기가 쉽지 않다고 결정했습니다. 또한 LALR 기반 파서를 사용하고 있기 때문에 실패했을 것입니다. 당신의 솔루션은 장점이 있지만이 일에 우선 순위를두기에는 너무 많은 일이 있습니다. (이 문제를 완전히 피하기 위해 더러운 해킹을 사용했지만 결국이 질문의 범위를 벗어납니다.) – BlackVegetable