2012-02-05 20 views
1

いくつかの非常に基本的な情報を生成するために、いくつかのC++ソースファイルを分析する必要があります。私がやろうとしています事は、このように書きます:Javaでの非常に単純なC++字句解析

  1. たちはアナライザは、字句解析のようなソースファイルを読み込みます
  2. を分析するためにC++の文法とC++ソースファイルを持っていると仮定し、それはC++文法で定義されているようなキーワードなどを識別します。
  3. 各ラインを読んだ後、アナライザが出力されます以下の情報:ライン#:語彙情報。たとえば、このことを考慮してください。

    int main(int x, int y) 
    { 
        return x+y; 
    } 
    

プログラムの出力は以下となります。同様の

Line 1: function: main, params: x, y 
    Line 2: paren "{" 
    Line 3: keyword: "return" 

か何か。

誰かがこれを行う方法を教えていただけますか?私はAntlrとTXLを見てきましたが、もっと簡単な方法があるはずです。この作業を行うJavaプログラムを作成したいと思います。 まず、ファイル内の関数定義を対応する行番号とともに取得することです。どんな助けでも大歓迎です。

おかげで、 アントン

+2

最高の賭けは、解析を行うためにClangを取得することです。あなたはASTを分析するだけです。 – Xeo

+2

stackoverflowはコードを書く人を見つける場所ではありません。より具体的な質問がありますか?または、あなたが立ち往生する前にどこにいるのかを示すコードでしょうか? – Jasper

+0

"C++の文法が「どういう意味ですか?それにマッチする正規表現はありますか?あなたがすでに正規表現を持っているなら、あなたはすでに戦闘の半分を勝ち取っています。 – chucksmash

答えて

2

今日のベストベットはおそらくCLangです。

打ち鳴らすはLLVMの上にC/C++/Objective-Cの/のObjective-C++のフロントエンドであることのために知られているが、それはライブラリのセットとして設計されている具体的個々の構成要素は、外部再利用できるようにコンパイラ自体。

興味深いことに、libclangは、コア前処理と意味解析をラップしてC言語で「解析木」を提供するCライブラリです。なぜならC言語はフランジャーフランカですからです。 libclangは、特にPythonバインディングの基礎となるので、あなたが本当にJavaでそれをしたい場合は、(私が正しく用語を覚えていれば)、それとのインターフェイスにJNIを使​​用することができるはずです。また、libclangインターフェイスは外部のユーザーが使用するを意味するので、内部コンパイラ表現とは異なり、非常に安定しています()。

自動完了のためのvimプラグインclang_completeを作成するためにPythonバインディングが既に使用されています。たとえば、これについてはblog articleと読むことができます(実際に動作しているかわいいビデオがあります)。

注:Pythonバインディングは現在、Tobias Grosserの指導の下、Gregory Szorcによって大幅に改善されています。see Gregory's announcement hereです。

+0

ありがとうございました!ええと、CLangはチェックアウトする価値があるもののようです。 – Anton

3

あなたは、あなたが字句解析を行っていない提案してきた出力をしたい場合は、あなたが探しているものは、例えば、関数の宣言とオブジェクトの初期化を理解しなければならないので、少なくとも少しは構文解析を行っています。あなたがそれらの最初のトークンが実際に関数を定義することを理解したいのに対し字句解析はバック

int 
main 
(
int 
x 
, 
int 
y 
) 
{ 
return 
x 
+ 
y 
; 
} 

のようなものを、あなたを与えるだろう。

残念ながら、C++用を解析することは困難なことで有名であり、ほとんどのパーサジェネレータは、非常に特別な作業をC++パーサを生成するために校正する必要があります。私は、おそらくElsaのようなもので、既存のC++パーサフレームワークを調べることをお勧めします。これにより、必要な情報を使用できる形式で提供します。もう1つの選択肢は、C++コンパイラに直接フックし、すべての解析と行番号情報を処理する基礎となるASTを処理することです。 Treehydraツールはここでは便利かもしれませんが、JavaではなくJavaScriptコードを書くことになります。

希望すると便利です。

+0

ご意見ありがとうございました – Anton

関連する問題