這是一個早期階段的 PHP 解析器,從一開始就為 IDE 使用場景而設計(更多詳細信息,請參閱設計目標)。還有大量工作要做,因此此時此存儲庫主要充當實驗和對話的開始。
這是 v0.1 分支,它更改了資料結構以支援在初始 0.0.x 發行版之後新增的語法。
配置機器後,您可以使用解析器透過友善的 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 Node 的錯誤。解析器優雅地處理錯誤,//因此可以在 IDE 使用場景中使用(程式碼通常不完整)。 ($astNode->getDescendantNodes() as $descendant) {if ($descendant instanceof NodeStringLiteral) {// 列印節點文字(不含空格或註解)var_dump($descendant->getText());// 所有節點$grandParent = $descendant->getParent()->getParent();var_dump($grandParent->getNodeKindName());// AST 具有完全代表性,並且可以往返到原始來源。格式化和重構工具。 }// 除了檢索Node 的所有子節點或後代之外,// 節點還公開特定於Node 類型的屬性。 /為了減少記憶體消耗,位置被表示為單一整數//文件索引,但它們的行和字元位置很容易檢索。 );echo "行:$lineCharacterPosition->行,字元:$lineCharacterPosition->字元"; } }
注意:API 尚未最終確定,因此請提交問題讓我們知道您想要公開哪些功能,我們將看看我們能做什麼!另外,請在解析樹中提交任何具有意外行為的錯誤。我們仍處於早期階段,非常感謝您提供的任何回饋。
容錯設計 - 在 IDE 場景中,根據定義,程式碼是不完整的。在輸入無效程式碼的情況下,解析器仍然應該能夠恢復並產生有效的完整樹以及相關的診斷。
快速且輕量級(應該能夠每秒解析幾 MB 的源代碼,為其他功能留出空間)。
記憶體高效的資料結構
允許將來增量解析
遵守PHP語言規範,支援PHP5和PHP7語法
產生的 AST 提供語義和轉換操作所需的屬性(完全代表性等),這些屬性也需要具有高效能。
完全具有代表性並且可往返返回解析的文字(所有空格和註釋“瑣事”都包含在解析樹中)
可以輕鬆地透過父/子節點遍歷樹
< 100 毫秒 UI 回應時間,因此每個語言伺服器操作應< 50 毫秒,以便為並行進行的所有其他操作留出空間。
隨著時間的推移,簡單且可維護 - 解析器往往會變得非常混亂,而且速度非常快,因此可讀性和調試能力是重中之重。
可測試 - 解析器應該會產生可證明有效的解析樹。我們透過定義並持續測試一組關於樹的不變量來實現這一點。
友善且描述性的 API 讓其他人可以輕鬆地進行建置。
用 PHP 編寫 - 讓 PHP 社群盡可能輕鬆使用和貢獻。
為了確保每一步都有足夠的正確性,解析器正在使用以下增量方法進行開發:
第 1 階段:編寫不支援 PHP 語法,但支援 EOF 和 Unknown token 的詞法分析器。為所有不變量編寫測試。
第2階段:支援PHP詞法文法,大量測試
第 3 階段:寫一個不支援 PHP 語法的解析器,但產生錯誤節點樹。為所有不變量編寫測試。
第四階段:支援PHP句法語法,大量測試
第 5 階段(進行中):現實世界驗證與最佳化
正確性:驗證範例程式碼庫上沒有產生錯誤,與其他解析器進行基準測試(調查任何不一致的實例),模糊測試
效能:針對大型 PHP 應用程式的設定檔、基準測試
第 6 階段:最終確定 API,使人們盡可能輕鬆使用。
一些 PHP 語法結構(即 Yield-Expression 和模板字串)尚不支持,並且還存在其他雜項錯誤。但是,由於解析器是容錯的,因此這些錯誤會得到妥善處理,並且產生的樹是完整的。為了更全面地了解我們所處的位置,您可以運行“驗證”測試套件(有關運行測試的更多信息,請參閱貢獻指南)。或簡單地看一下目前的驗證測試結果。
儘管我們還沒有開始效能優化階段,但到目前為止我們已經看到了有希望的結果,並且還有很大的改進空間。有關我們當前方法的詳細信息,請參閱它的工作原理,並在您自己的計算機上運行性能測試以親自查看。
設計目標- 了解專案的設計目標(功能、效能指標等)。
文件- 了解如何從專案中引用解析器,以及如何對 AST 執行操作來回答有關程式碼的問題。
語法視覺化工具- 更切實地感受 AST。發揮創意-看看你能否打破它!
目前狀態和方法- 支援多少語法?表現?記憶? API穩定性?
它是如何運作的——了解架構、設計決策和權衡。
詞法分析器和解析器
容錯策略
增量解析
開放性問題
驗證策略
貢獻! - 了解如何參與,查看一些教育提交的提示,這將幫助您提高程式碼庫(即使您以前從未使用過解析器),以及更容易迭代的推薦工作流程。
該專案採用了微軟開源行為準則。有關詳細信息,請參閱行為準則常見問題解答或聯繫 [email protected] 提出任何其他問題或意見。