2016-04-22 13 views
1

努力尋找標記化腳本的Python庫(查找特定的標記,如函數定義名稱,變量名稱,關鍵字等)。在Python中用於C++的簡單標記器

我已經設法使用像this這樣的東西找到關鍵字,空格等,但我發現它是函數/類定義名稱等相當大的挑戰。我希望使用一個預先存在的腳本;我探索Pygments沒有成功。其lexer似乎令人驚訝的是我想要的,但不知道如何在Python中使用它,並且還爲每個找到的令牌獲得位置

比如我期待在做這樣的事情:從源代碼

int fac(int n) 
{ 
    return (n>1) ? n∗fac(n−1) : 1; 
} 

上面我想獲得:

函數名: 'FAC' 的位置(X,Y ) 變量名: 'n' 個在位置(X,Y + 8)

EDITED: 任何建議將自我可以理解我在黑暗中關於C++中的標記和解析?

+0

你是否在談論「函數/類定義」,因爲在識別它們的語法?如果是這樣,這基本上是一個不適合於標記器的問題,並且您需要一些可以處理無環境語法的東西,即解析器 –

+0

[Python中的標記器與Pygments的]可能的重複(http://stackoverflow.com/questions/36801263 /分詞器與 - Pygments來做合蟒)。你幾分鐘前問過這個問題! – ChrisP

+0

@ChrisP我試圖擴展它,並將其與我之前的問題區分開來,因爲現在我詳細介紹了另一種更通用的(可能)路由。 –

回答

3

Eli Bendersky是一個聰明的人,有時在SO上活躍於此。他在這個問題上有一篇博客文章,我會直接轉介給您:Parsing C++ in Python with Clang

因爲東西消失了,這裏的外賣:

禮Bendersky寫了一個C語言( C++)語法分析器在Python,叫pycparser。人們不停地問他是否要添加對C++的支持。他不是。他建議人們使用libclang的Python綁定來訪問「Clang團隊發誓保持相對穩定的C API,從而允許用戶在抽象語法樹(AST)的層級上檢查解析的代碼」。

您可以單獨在PyPI上找到綁定here.請注意,您必須安裝clang,因此您可能只想將PYTHON_PATH直接指向安裝位置。

+1

這是一個很好的答案。我試圖解釋爲什麼OP不能做他想做的事情,但是這似乎有一些更實際的解決方案。 +1 –

2

你正在努力尋找一個python庫來做你想做的事情,因爲你想要的是根本無法做到的。

我設法找到關鍵字,空格等。使用這樣的事情,但我發現它的功能/類定義的名稱等

相當大的挑戰你的意思是這樣的:

foo = 3 
def foo():pass 

什麼是foo?一個標記器應該/可以告訴你,foo是一個標識符。這是上下文告訴你它是一個變量還是一個函數聲明。你需要一個解析器來處理上下文無關語法。在數學上,上下文無關語法的空間對標準詞法分析器來說太大了,無法解決。

嘗試解析:here's one in python

通常我會嘗試在這裏爲您提供鏈接的主題來區分,但是這太寬而不能提供一個良好的鏈接。如果你有興趣,從任何標準的編譯器文本開始。在SE的其他地方,我們看到此問題彈出爲theoretical question,並且在某種形式下,as a famous question about html

一旦你意識到標記器(通常)是建立在(大部分)正則表達式上的,它會變得更加明顯,爲什麼你的任務不會快樂地結束。


現在,你知道的術語,我想你會發現this SO article useful,其中建議gcc-ml。我不知道它是如何最新的,但它是你正在尋找的程序的類型。

+0

你的觀點確實有幫助;事實上,我正在黑暗中尋找,因爲我誤解了我正在尋找的東西。那麼,您是否知道我的描述中提到的處理C++的解析器? –

+0

是的。 Gcc是一個很好的:)所有開玩笑,任何*解析器都可以處理C++。我不會試圖展開自己的 - C++是一種非常複雜的語言。我選擇的是一個很好的,但再次,採取現有的C++編譯器,只是你的分析樹。我熟悉的大多數編譯器允許您在不完全編譯的情況下轉儲此信息 –

+0

@ nk-fford查看我的編輯,我認爲它有您要查找的類型 –