2016-01-17 71 views
1

我正在尋找步驟/庫/方法來解決這個問題陳述。解析編程語言並識別它的組件

  1. 給定一個編程語言的源文件,我需要解析它並將其細分爲組件。

例如: 給定一個Java文件,我需要找到它。進口

  1. 列表
  2. 類存在於類
  3. 方法中它是
  4. 屬性 - 沿參數(如有)。 等

我需要提取這些並分別存儲它。 原因爲什麼我想要做它?

  1. 我想在這些組件的頂部建立一個倒置索引。

實施例的查詢來反向索引 1.找到與類名的文件的列表:樣品 2.查找其中變量XXX是AAA級內使用的位置。

我需要支持查詢喜歡上面

所以,我的計劃是給定一個文件,如果我建立從它這些組件,這將是很容易建立在它的頂部倒排索引。

示例:Sample - 類 - Sample.java(關鍵字 - 組件 - 文件名) 我想構建一個如上所述的倒轉索引。

我看到它正在像IntelliJ這樣的許多IDE中實現。我感興趣的是它需要花費多少精力來構建這樣的東西。我想嘗試對至少一種語言實施相同的操作。

在此先感謝。

回答

0

你可以嘗試做這個「只是」一個解析器;對於你的具體例子來說,這可能就夠了。

但是,您需要每種語言的解析器。如果你堅持只用Java,你可以很容易地找到Java解析器;只需重用一個,就沒有必要重新創建一組語法規則來描述Java。

對於多種語言,這開始變得棘手。您可以:

  • 嘗試爲每種語言查找單獨的解析器。這對於主流語言來說可能是成功的。當你遇到不太知名的語言時,這些難度會更大。如果你成功了,你將會遇到解析器可能不兼容的問題。現在將它們粘合在一起共同收集您的索引信息將變得一團糟。
  • 選擇一種解析技術,併爲您關心的所有語言獲取語法。你只有兩個現實的選擇:YACC/Bison和ANTLR。 作爲一個實際問題,YACC和Bison已經被用來實現許多語言......但是語法文件並不是集中在一個地方,所以很難找到它們。 ANTLR至少有一個存儲庫,你可以在他們的網站上找到。所以這可能是一種工作。

它將相當大的努力將所有這些裝配成一個整體。

複雜的是,您可能不僅僅需要原始語法;您可能想知道符號的含義,並且對於每個符號,確切地說它是在哪個文件中定義的。畢竟,你希望你的索引在規模上是準確的,並且這將需要從foo函數名稱中區分foo變量名稱。可以說你需要符號表。作爲一般規則,這是語言的純語法分解的地方; 有嚴重的Life After Parsing

在這種情況下,您需要一套用於從不同語言中提取信息的集成工具。

我們的DMS Software Reengineering Toolkit就是這樣一個框架,它有大約40種語言預定義它。我們使用OP建議的流程來爲基於DMS的搜索工具構建代碼庫索引。像DMS一樣建設是一項巨大的努力。