2016-12-05 9 views

답변

1

그것은 컴파일러의 나머지해야하지만 파서가 정상적으로 복구 할 수 있도록 Expression 유형으로 더 일반적으로 지정되고 그것을 나무에 보관하십시오.

체크 아웃 this comment from the source을 확인하십시오.

// We allow arbitrary expressions here, even though the grammar only allows string 
// literals. We check to ensure that it is only a string literal later in the grammar 
// check pass. 

The text <code>import foo from wat</code>, where <code>wat</code> has a red underline indicating a syntax error (i.e. "String literal expected.")

파일 내의 모든 텍스트는 해당 트리의 일부 노드에 속해 있습니다. 위와 같은 경우 이라는 Identifier에 오류를보고하고자합니다.

구문 분석 오류 이후에 구문 분석을 수행 했으므로 표현식이 무엇이든 importSpecifier이어야합니다. 그렇지 않으면 노드 이되어야 함을 어떻게 알 수 있습니까? ImportDeclaration이 소유 한 컨텍스트는 구문 분석 후에 구문 분석 오류를보고해야한다는 것을 알 수 있습니다.

언급했듯이, importSpecifier의 모든 사용자는 importSpecifier이 표현 인 좀 더 일반적인 경우를 처리해야합니다. 이것은 분명히 고통스럽고 불행히도 당신에게 큰 해결 방법이 없습니다.

+0

감사합니다. Daniel. 그러나이 설명은 무엇을 설명하지만 왜 그렇게하는지 설명하지 않습니다. 코드를 살펴보면,'import'와'export' 둘 다 그 함수를 사용하기 때문입니다. 어쩌면 그것을 향상시키는 한 가지 방법은 적절한 유형을 반환하는 제네릭 함수로 만드는 것입니다. 왜 'ImportDeclaration.moduleSpecifier'가'StringLiteral'이 아닌지 혼란 스럽기 때문에 다른 사람들이 무엇이 될지 궁금하게 만들고'.text'를 얻기 위해 추가 캐스트를 수행해야합니다. – unional

+0

편집 한 내용이 명확 해 졌습니까? –

+0

나는 본다. 만약'importSpecifier'가'StringLiteral'이라면, 전체 import 문은 해석에 실패하고, 전체 문장은 에러가되는 것입니까? 현재, 우리는'importSpecifier' 표현식으로 오류를 분리하고 스크린 샷 에서처럼 오류를보고 할 수 있습니다. – unional