1

Swift 컴파일러 (swiftc -dump-ast)가 생성 한 AST 덤프를 구문 분석하는 ANTLR 4 문법을 작성하고 있습니다.불균형 괄호로 핸들 입력

예제 Swift 프로그램과 아래의 해당 AST 덤프를 참조하십시오.

불행히도 bug in the compiler으로 인해 덤프에 불균형 괄호가 포함될 수 있습니다 (일부 트리 노드에는 닫는 괄호가 없습니다).

treeNode 
    : '(' treeNodeContent ')' 
    | functionParameterListNode 
    | '(' treeNodeContent 
    ; 

불행히도, 이러한 변화는 구문 분석 성능을 죽이고 다음과 같이 treeNode 규칙을 변경

등의 손상 출력을 구문 분석 할 수 있습니다. 구문 분석 시간이 ~ 50ms에서 ~ 70 ... 80s까지 증가합니다.

문법에 약간의 모호함이 있지만 대부분의 경우 treeNode 규칙에 소요됩니다. 프로필러는 막대한 양의 선견자 및 DFA 캐시 실패율을 보여줍니다.

이 문제가 발생하는 구체적인 유형의 노드를 찾아 내고 ~ 50s의 파싱 시간을 준 노드에만 픽스를 적용하는 것이 더 좋지만 여전히 좋지는 않습니다.

여기에 complete grammar, example program : 및 그 AST dump입니다.

질문 : 성능에 영향을주지 않는 불균형 괄호를 처리하는 다른 방법이 있습니까?

+0

생성을 다음 디버깅 출력을 구문 분석합니다 (AST 덤프가 무엇인지입니다) 특히 신뢰할 수없는 디버깅 출력은 최적 보인다 AST를 직접 검사하여 재 파싱을 피하십시오. JSON을 생성 할 수있는 것으로 보이는 [SourceKitten] (https://github.com/jpsim/SourceKitten)을 보셨습니까? – rici

답변

1

왼쪽 인수가 고정에 내 첫 번째 시도가 될 것입니다 : 당신이 SourceKit로 사용할 수 있습니다 때

treeNode 
    : '(' treeNodeContent ')'? 
    | functionParameterListNode 
    ; 
+0

불행히도 결과는 같습니다. –