2011-01-28 13 views
4

私はOpenEdge(4GLデータベース言語)用のパーサーを作成しようとしており、ANTLR(または同様のもの)を使用したいと考えています。前処理されていないコードにANTLRを使用できますか?

私はこれが問題になるかもしれないと思う2つの理由があります。

終わり .がラインである
assign 
    customer.name = 'Customer name' 
    customer.age = 20 
. 

  1. OpenEdgeのような構造を可能にする4GLデータベース言語であるが、このステートメントは、2つのデータベースフィールドの割り当てを結合します。 OpenEdgeには、これらの構成要素の多くがあります。上記の例では

    // file myinc.i 
    7 * 14 
    
    // source.p 
    assign customer.age = {myinc.i}. 
    

    を、私は事実を維持する必要があります:私は、ソースファイルのすべての詳細を維持する必要があるので、私はファイルを解析することができます前に、私は、プリプロセッサ文を展開することはできません

  2. customer.age7 * 14の代わりに{myinc.i}を使用して割り当てられました。

私はこれをacchieveするANTLRを使用できますか私は自分自身のパーサーを作成する必要がありますか?

UPDATE:
私はそれから実行ファイルを生成するのではなく、コード分析のためにしないように、このパーサを必要とします。これは、インクルードが使用されたという事実を含むためにASTを必要とする理由です。

答えて

3

ANTLRはパーサではなく、パーサージェネレータです。

言語用の独自のパーサーを作成するか、(ANTLR)文法を作成して、ANTLRでレクサーとパーサーを生成させます。あなたの文法にカスタムコードを混ぜて、あなたの割り当てを追跡することができます。

答えは:はい、あなたはです。はANTLRを使用しています。

私はOpenEdgeに慣れていませんが、SQL文法は通常、パーサーや文法を書くのは難しいです。 ANTLR wikiを見て、一から書き上げるのは簡単なことではありません。あなたは言及しませんでしたが、私はあなたの言語を解析できる既存のパーサーを見たと思いますか? FYI

:あなたはすでにそれを持っているかもしれませんが、ここではOpenEdge SQL方言のためのBNF文法などのドキュメントへのリンクがあります:http://www.progress.com/progress/products/documentation/docs/dmsrf/dmsrf.pdf

+0

質問を更新しました。私はあなたが言っていることを得る。私が見ている特定の問題は、私がASTでプリプロセッサの構造を保持する必要があるという事実です。あなたはその問題について詳しく説明できますか? –

+0

あまり詳しく書いてはいません:文法の中で '{myinc.i} 'を' 7 * 14'に置き換えないと(あなたの文法のカスタムコードで)、 '{myinc.i}'あなたの解析木(またはAST)にそのまま残ります。 –

+0

出力ASTを補強するために使用できる拡張されたすべてのコンポーネントの位置を持つメタストリームを作成するプリプロセッサを持つというアイデアはどう思いますか?そうすれば、きれいな文法が得られますが、すべての詳細が保持され、ASTにはプリプロセッサパラメータのコードパラメータ(クエリの一部を含むパラメータを含むことができます)があります。アドバイスはありますか? –

0

Cプリプロセッサと同じことをすることができます。ソース位置を設定するある種類のプラグマで文法を拡張し、プリプロセッサにそのプラグマを詰め込んだコードを生成させることができます。

+0

私は質問を更新しました。すべての詳細を保持する必要がある理由は、私がソースコード分析を行っていることです。実際の実行可能ファイルはあまり役に立ちませんが、ソースコードはです。これはプリプロセッサを実際に使用することができない理由です。プラグマを記述していても興味深い内容がすべて削除されるからです( '#line'プラグマを意味すると思われます)。言い換えれば、私のASTは、コードのその時点でインクルードが使用されたという事実を含む必要があります。 –

+0

プラグマの任意のセットを作成することができます。ソースファイル名、行番号、列、タイムスタンプなどを保持します。 –

1

あなたがOpenEdge /プログレス4GLのためのオープンソースパーサがすでに存在していることを知っています? Proparseと呼ばれ、ANTLRを使用して書かれています(もともと、OpenEdge自身で手作業でコード化されましたが、最終的にANTLRに変換されました)。それはJavaで書かれていますが、私はあなたがIKVMを使用してC#でそれを実行できると思います。

ライセンスはEclipseライセンスであるため、ビジネスフレンドリーです。

+0

運があれば、そのプロジェクトの文法を使うことができます。本当にありがとう。 –

+0

ある時点で、私はソースリポジトリへのコミットに関するいくつかの自動化されたコードレビューを行うために、Proparse(Prolintは古くなった古いメタリンク)を使ってOpenEdge用の新しいリンターを書くつもりだった。しかし、私の最優先事項は、SourceSafeからバージョンコントロールシステムを取り除くことです。私はあなたがプロパーで何をしているかを見て非常に興味があります。 –

0

複数の割り当てに関する問題は、文法で扱いやすいほど簡単です。ただ、複数のassignementsを許可する:あなたが使用することができます

assign_stmt = 'assign' assignments '.' ; 
assignements = ; 
assignments = assignments target '=' expression ; 

一つの方法は、非終端記号が許可され、単にプリプロセッサ拡張をしないことができますどこプリプロセッサトークンのシーケンスを許可するように文法を強化することです。

expression = ... ; 

だけのルールを追加します:あなたたとえば、あなたは、いくつかの文法規則を持っている

expression = '{' include_reference '}' ; 

これはプリプロセッサが非終端またがるいくつかのlanaguage要素を生成するために不正に使用されていない程度に動作します境界。

あなたはどのようなコードを実行しますか?何かを行うには、preprocessorディレクティブを拡張する必要がある解像度を命名して入力する必要があります。その場合は、名前解決を行うためにツリーを拡張する必要があり、側面に関連するインクルード情報が必要であるため、より高度なスキームが必要になります。

私たちのDMS Software Reengineering ToolkitにはOpenEdgeパーサーがあります。ここでは、以前の「インクルードファイル参照を保持する」というトリックがあります。 DMSのCパーサは、マクロ(OpenEdge "include"はマクロ定義を書くのに面白い方法です)にツリーに "マクロノード"を追加します。子ノードにはツリーが含まれています。マクロ定義。これにはいくつかの慎重な組織化とマクロノードの特殊なハンドリングが必要です。

+0

ありがとうございました。私はANTLRをさらに見ていて、これをレクサーで解決することは、行く方法のように見えます。 –

2

このソリューションは、OpenEdgeアーキテクト自体の中にあります。あなたは、openge architect jarファイル(C:\ Progress \ OpenEdge \ oeide \ eclipse \ plugins \ com.openedge.pdt.core_10.2.1.01 \ lib \ progressparser.jar)をチェックアウトする必要があります。

パーサークラス。彼らはEclipseにつながっていますが、私はEclipseフレームワークから分離して動作します。 progressparserはantlrを使用し、antlrドキュメントは次のフォルダにあります。 C:\ Progress \ OpenEdge \ oeide \ eclipse \ plugins \ com.openedge.pdt.core_10.2.1.01 \ oe_common_services.jar。

このファイルの中にantlrの定義があります(opensge.gを確認してください)。

幸運。あなたが分離されたEclipse環境を望むなら、ただメールをドロップしてください。

+0

ありがとうございます。 –

関連する問題