2016-05-01 16 views
0

私は、Sony Cell SPU命令の入力ファイルを解析するための小さなプログラムを作成し、その命令のバイナリ形式のテキストを出力します。入力テキストの解析とファイルへの出力

基本的な考え方は以下です:

入力テキストフォーマットが命令であるRT/RA/RB

a r3,r2,r1 
ah r6,r5,r4 

出力テキストのフォーマットは:オペコード/ RB/RA/RT

00011000000000000100000100000011 
00011001000000010000001010000110 

基本的には、コマンド構文(a、ah、etc ...)を解析し、オペコードを決定しています。この情報は、私に命令のフォーマット(レジスタ形式)も与えます。一度私はアクセスされているレジスタを知って、私は7ビット値(r3 = 0000011など)にこれらの値を変換します。次に、32ビットの変換された命令を出力テキストに書き込みます。

ここで私は固執していますが、どのように命令構文の構文解析を行うかについてです。

特に、入力テキストファイルの各行をchar arrayに読み込み、インデックスの下位ビットをチェックし、それを各命令の文字列と比較することでしたが、私はそうではありませんこれは良い方法だと思います。

このタイプの解析と比較を実行するには、どのような方法が適していますか? 、コマンドの数とその長さに応じて、

switch(array[0]) 
{ 
case 'a': 
    switch(array[1]) 
    { 
     case ' ': 
      // end of command! 
      break; 
     case 'a': 
      // ... 
      break; 
     default: 
      // unknown command 
     break; 
    } 
    break; 
case 'b': 
    // analogously 
    break; 
default: 
    // unknown command 
    break; 
} 

:私は右のあなたを理解していれば

答えて

0

は、あなたが、あなたはこのような何かを試みることができる

if(strcmp(array, "cmd1") == 0) 
else if(strcmp(array, "cmd2") == 0) 
//... 

の連鎖を回避したいですしかし、これは簡単には判読できません。

別のアプローチ:::std::unordered_map(または:: std :: tr1 :: unordered_map、古いC++標準)。必要に応じて、文字列を適切なハンドラ関数(ポインタ)または(ポリモーフィック!)クラスにマップします。 find(インデックス演算子[]ではなく、新しい要素を追加する)でハンドラを取得して、単に呼び出すようにしてください...あなたがかなり大きな命令セットを持っているなら、このアプローチは面白いです。

おそらく、このような何か:

void a(char* cmd) {/*...*/} 
void ah(char* cmd) {/*...*/} 
/* ... */ 

typedef ::std::unordered_map<char const*, void(*)(char*)> Handlers 
void main(int, char*[]) 
{ 
    Handlers handlers; 
    handlers["a"] = &a; 
    handlers["ah"] = &ah; 
    /* open file */ 
    char array[128]; 
    char* arguments; 
    /* for each line: */ 
    { 
     /* 
     *read into array; 
     * you need to separate the command from the 
     * parameters e. g. by setting the first space following 
     * to 0 ('\0'), and setting arguments to the first 
     * non-whitespace afterwards 
     */  

     Handlers::iterator handler = handlers.find(array); 
     if(handler == handlers.end()) 
     { 
      // unknown command 
     } 
     else 
     { 
      (*handler)(arguments); 
     } 
    } 
    return 0; 
} 
関連する問題