6

言語「A」で書かれたファイルのコレクションがあり、対応する言語「B」のファイルに翻訳する必要があります。このタスクを自動化できるプログラム/パーサーを作成したいと考えています (おそらく、単一のプログラムではなくツールチェーンです)。ただし、ツールチェーンのプログラムに適した選択肢を見つけるのに苦労しています。

目的のツールチェーンの図

言語 Aは組み込みソフトウェア コード、つまり低水準言語です。90% が標準の C コードで、10% が「カスタム」コードです。つまり、ファイルには、標準の C コンパイラでは理解できない小さなセグメントも含まれています。90% C コードは、C で可能な任意のランダムな C 構造ではありません (セマンティクスに関してこれを解析するのは難しいでしょう) が、特定の繰り返し式、アクション、およびパターンに従いますそして、常に(多かれ少なかれ)同じ方法でこれらのパターンに従います。ほとんどの場合、メモリへの書き込み操作を実行し、C 構造体や列挙型などの複雑な構造は含まれません。

言語 A の通常の低レベル C コードの例:

#define MYMACRO 0x123
uint32_t regAddr;
regAddr = MYMACRO;
*(uint32_t*)(regAddr) = 0xdeadbeef;

言語 A の「カスタム コード」の例:

custom_printf("hello world! Cpu number: %d \n", cpu_nr);

言語 Bは 100% カスタム言語です。この変換は、デバッグ目的で別のツールでファイルを操作するために必要です。上記の例を翻訳すると、おおよそ次のようになります。

definemacro MYMACRO 0x123
define_local_int regAddr
localint.set regAddr = MYMACRO
data.write regAddr 0xdeadbeef

注: 私は、Stackoverflow が「どのツールが好きですか?」というオープンな議論のためのサイトであることを意図していないことを十分承知しています。しかし、この質問はむしろ「仕事を成し遂げる意味のあるツールセットが少なくとも 1 つ必要です」のようなものだと思います。

これまでの私の考慮事項とアプローチは次のとおりです。

  • パフォーマンスは私のツールチェーンには関係ありません。実装と変更への適応が容易でなければなりません。
  • 最初のアプローチ: 言語 A はほとんどが C コードであるため、C コードを AST (Abstract Syntax Tree) に解析する C パーサーを提供するpycparser Python Plugin を最初に考えました。私の計画は、言語 A のファイルを読み込み、AST から言語 B のファイルを作成する Python プログラムを作成することでした。ただし、言語 A の 10% のカスタム プロパティを完全にサポートするために、pycparser プラグインを適応/教育するのは難しいことがわかりました。
  • 2 番目のアプローチ: Yacc/Bison や ANTLR などの「汎用パーサー ジェネレーター」を使用します。ただし、ここでは、どのツールが自分のニーズに合っているか (LALR パーサーを備えた Yacc/Bison または LL パーサーを備えた ANTLR)、およびそのようなパーサーを含む適切なツールチェーンをセットアップして (Python などで) データを処理する方法がわかりません。生成されたパーサーがカスタム言語 B を作成するために作成する構造。 選択したパーサー ジェネレーターが、10% カスタム C 言語部分に簡単に適応できる既存の C 言語定義を提供する場合にも役立ちます。また、これまで汎用パーサーを使用したことがないことにも言及しておく必要があります。

このタスクのための有意義なツールのセットについて誰かアドバイスをください。

編集: これが漠然とした質問のように思われる場合はお詫び申し上げます。できる限り正確に記載しようとしました。言語 A と B の例を追加して、言語の構成をより明確にし、言語 A がセマンティクスに関して簡単に理解できる特定の繰り返しパターンに従うことを示しました。

この編集で明快さと広さが改善されない場合は、提案されたとおりにプログラマーに再投稿します。

編集 2 : わかりました。このトピックは明らかにここではまだ置き換えられているように見えるので、ここに質問を撤回します。最初の数人のポスターから貴重な情報をすでに受け取っていたので、汎用パーサー ジェネレーターを使ってさらに実験を行うことができました。

4

0 に答える 0