이것은 처음부터 IDE 사용 시나리오를 위해 설계된 초기 단계 PHP 파서입니다(자세한 내용은 디자인 목표 참조). 아직 해야 할 일이 너무 많기 때문에 현시점에서 이 저장소는 주로 실험이자 대화의 시작 역할을 합니다.
이는 초기 0.0.x 릴리스 라인 이후에 추가된 구문을 지원하기 위해 데이터 구조를 변경하는 v0.1 분기입니다.
머신을 구성한 후에는 파서를 사용하여 친숙한 API를 통해 추상 구문 트리(AST)를 생성하고 작업할 수 있습니다.
<?php// 자동 로드 필수 클래스require __DIR__ . "/vendor/autoload.php";use MicrosoftPhpParser{DiagnosticsProvider, Node, Parser, PositionUtilities};// 새 파서 인스턴스화 인스턴스$parser = new Parser();// 문자열 내용에서 AST 반환 및 인쇄$astNode = $parser ->parseSourceFile('<?php /* comment */ echo "hi!"');var_dump($astNode);// 오류 가져오기 및 인쇄 AST 노드에서. 파서는 오류를 정상적으로 처리하므로// IDE 사용 시나리오(코드가 불완전한 경우가 많음)에서 사용할 수 있습니다.$errors = DiagnosticsProvider::getDiagnostics($astNode);var_dump($errors);// $astNodeforeach ($astNode->getDescendantNodes() as $descendant) {if ($descendant instanceof NodeStringLiteral) {// 인쇄 노드 텍스트(공백이나 주석 없음)var_dump($descendant->getText());// 모든 노드는 상위 노드에 다시 연결되므로 트리를 탐색하기 쉽습니다.$grandParent = $descendant->getParent()-> getParent();var_dump($grandParent->getNodeKindName());// AST는 완전히 대표되며 다음으로 라운드트립 가능합니다. 원본 소스.// 이를 통해 소비자는 안정적인 형식 지정 및 리팩토링 도구를 구축할 수 있습니다.var_dump($grandParent->getLeadingCommentAndWhitespaceText()); }// 노드의 모든 하위 또는 하위 항목을 검색하는 것 외에도// 노드는 노드 유형과 관련된 속성을 노출합니다.if ($descendant instanceof NodeExpressionEchoExpression) {$echoKeywordStartPosition = $descendant->echoKeyword->getStartPosition();// 메모리 소비를 줄이기 위해 위치는 문서에 단일 정수// 인덱스로 표시되지만 해당 줄과 문자 위치는 쉽게 표시됩니다. 검색됨.$lineCharacterPosition = PositionUtilities::getLineCharacterPositionFromPosition($echoKeywordStartPosition,$descendant->getFileContents() );echo "라인: $lineCharacterPosition->라인, 문자: $lineCharacterPosition->문자"; } }
참고: API는 아직 완성되지 않았으므로 문제를 제출하여 노출하려는 기능을 알려주시면 무엇을 할 수 있는지 살펴보겠습니다. 또한 구문 분석 트리에서 예상치 못한 동작이 있는 버그를 신고해 주세요. 우리는 아직 초기 단계에 있으므로 귀하의 의견을 보내주시면 감사하겠습니다.
오류 허용 설계 - IDE 시나리오에서 코드는 정의에 따라 불완전합니다. 유효하지 않은 코드가 입력된 경우에도 파서는 유효하고 완전한 트리와 관련 진단을 복구하고 생성할 수 있어야 합니다.
빠르고 가볍습니다(다른 기능을 위한 공간을 확보하기 위해 초당 수 MB의 소스 코드를 구문 분석할 수 있어야 함).
메모리 효율적인 데이터 구조
향후 증분 구문 분석 허용
PHP 언어 사양을 준수하고 PHP5 및 PHP7 문법을 모두 지원합니다.
생성된 AST는 의미론적 및 변환 작업에 필요한 속성(완전히 대표성 등)을 제공하며 성능도 필요합니다.
구문 분석된 텍스트로 완전히 대표되고 왕복 가능합니다(모든 공백 및 주석 "퀴즈"가 구문 분석 트리에 포함됨).
부모/자식 노드를 통해 트리를 쉽게 순회 가능
UI 응답 시간이 100ms 미만이므로 병렬로 진행되는 다른 모든 작업을 위한 공간을 확보하려면 각 언어 서버 작업이 50ms 미만이어야 합니다.
시간이 지남에 따라 간단하고 유지 관리가 가능합니다. 파서는 매우 혼란스럽고 빠른 경향이 있으므로 가독성과 디버그 가능성이 우선 순위가 높습니다.
테스트 가능 - 파서는 증명 가능한 유효한 구문 분석 트리를 생성해야 합니다. 우리는 트리에 대한 불변성 세트를 정의하고 지속적으로 테스트함으로써 이를 달성합니다.
다른 사람들이 쉽게 구축할 수 있도록 하는 친숙하고 설명적인 API입니다.
PHP로 작성 - PHP 커뮤니티가 최대한 쉽게 사용하고 기여할 수 있도록 합니다.
모든 단계에서 충분한 수준의 정확성을 보장하기 위해 파서는 다음과 같은 증분 접근 방식을 사용하여 개발되고 있습니다.
1단계: PHP 문법을 지원하지 않지만 EOF 및 알 수 없는 토큰을 지원하는 어휘 분석기를 작성합니다. 모든 불변성에 대한 테스트를 작성합니다.
2단계: PHP 어휘 문법 지원, 다양한 테스트
3단계: PHP 문법을 지원하지 않지만 오류 노드 트리를 생성하는 파서를 작성합니다. 모든 불변성에 대한 테스트를 작성합니다.
4단계: PHP 구문 문법 지원, 다양한 테스트
5단계(진행 중): 실제 검증 및 최적화
정확성: 샘플 코드베이스에서 생성된 오류가 없는지 검증하고, 다른 파서에 대한 벤치마크(일치하지 않는 경우 조사), 퍼즈 테스트
성능: 대규모 PHP 애플리케이션에 대한 프로필, 벤치마크
6단계: 사람들이 최대한 쉽게 사용할 수 있도록 API를 마무리합니다.
일부 PHP 문법 구조(즉, 항복 표현식 및 템플릿 문자열)는 아직 지원되지 않으며 기타 기타 버그도 있습니다. 그러나 파서는 오류 허용 기능을 갖추고 있으므로 이러한 오류는 정상적으로 처리되며 결과 트리는 완성됩니다. 현재 위치에 대한 보다 전체적인 감각을 얻으려면 "검증" 테스트 모음을 실행할 수 있습니다(테스트 실행에 대한 자세한 내용은 기여 지침 참조). 또는 간단히 현재 검증 테스트 결과를 살펴보세요.
아직 성능 최적화 단계를 시작하지는 않았지만 지금까지 유망한 결과를 확인했으며 개선의 여지가 훨씬 더 많습니다. 현재 접근 방식에 대한 자세한 내용은 작동 방식을 참조하고, 자신의 컴퓨터에서 성능 테스트를 실행하여 직접 확인해 보세요.
디자인 목표 - 프로젝트의 디자인 목표(기능, 성능 지표 등)에 대해 알아보세요.
문서 - 프로젝트에서 파서를 참조하는 방법과 AST에서 작업을 수행하여 코드에 대한 질문에 답하는 방법을 알아보세요.
구문 시각화 도구 - AST에 대한 보다 실질적인 느낌을 얻으세요. 창의력을 발휘해 보세요. 깨뜨릴 수 있는지 확인해 보세요!
현재 상태 및 접근 방식 - 문법이 어느 정도 지원되나요? 성능? 메모리? API 안정성?
작동 방식 - 아키텍처, 디자인 결정 및 장단점에 대해 알아보세요.
렉서와 파서
오류 허용 전략
증분 구문 분석
공개 질문
검증 전략
기여하다! - 참여 방법을 알아보고, 코드베이스를 확장하는 데 도움이 되는 교육 커밋에 대한 몇 가지 지침을 확인하고(이전에 파서 작업을 해본 적이 없더라도) 반복을 더 쉽게 해주는 권장 워크플로를 확인하세요.
이 프로젝트는 Microsoft 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 행동 강령 FAQ를 참조하거나 추가 질문이나 의견이 있는 경우 [email protected]으로 문의하세요.