0

を読み込む簡単な描画プログラムを作成しようとしていますtranslate (rect 10 10 10 10) 50 50。私がやろうとしているのは、50 50が と一緒にtranslateなり、rectがすべての10s を保持するように分割することです。

これは PostScript 塗りつぶしです。ハッシュ テーブルとスタックについて聞いたことがありますが、それらの使用方法がわかりません。私は他のすべてを行いました(形状のすべての計算など)。正しい変数を指す数値を取得できるように、行を解析する方法がわかりません。

4

3 に答える 3

1

あなたの例はLispのS式のように見えるので、「S式パーサー」を検索してみてください。いくつかのヒットが出てきます。

「完全にやりたい」場合は、シェイプルーチンをC ++クラスとして実装し、SWIGを使用してそれらをGNU Guileに公開し、Schemeでアプリケーションを作成できます。しかし、それはおそらくあなたが考えていたものではありません。:-)

于 2011-05-29T02:05:33.940 に答える
0

まあ、これは少し古風かもしれませんが、それは単純で、これ以上速いものはありません。

void scanWhite(char*& p){
  while(*p==' ') p++;
}

bool seeInt(char*& p, int& num){
  scanWhite(p);
  char* p1 = p;
  bool bNegative = false;
  if (*p=='-'){bNegative = true; p++;)
  if (!isdigit(*p){p = p1; return false;}
  num = 0;
  while(isdigit(*p)){
    num *= 10;
    num += (*p - '0');
    p++;
  }
  if (bNegative) num = - num;
  return true;
}

bool seeWord(char*& p, char* word){
  scanWhite(p);
  int len = strlen(word);
  if (strncmp(p, word, len)==0 && !isalphanumeric(p[len])){
    p += len;
    return true;
  }
  else return false;
}

bool seeChar(char*& p, char c){
  scanWhite(p);
  if (*p != c) return false;
  p++;
  return true;
}

bool parseTranslateRect(char*& p
  , int& x0, int& y0, int& x1, int& y1
  , int& dx, int& dy
  )
{
  if (!seeChar(p, '(')) return false;
  if (!seeWord(p, "translate")) return false;
  if (!seeChar(p, '(')) return false;
  if (!seeWord(p, "rect")) return false;
  if (!seeInt(p, &x0)) return false;
  if (!seeInt(p, &y0)) return false;
  if (!seeInt(p, &x1)) return false;
  if (!seeInt(p, &y1)) return false;
  if (!seeChar(p, ')')) return false;
  if (!seeInt(p, &dx)) return false;
  if (!seeInt(p, &dy)) return false;
  if (!seeChar(p, ')')) return false;
  return true;
}

「(translate(rect ...」」のコピーが多数ある場合は、falseが返されるまで解析ルーチンを繰り返し呼び出します。

于 2011-05-29T02:25:50.687 に答える
0

AX ライブラリを使用してこの C++ パーサーを作成する方法は次のとおりです。

Rect r;
auto rect = "(rect " 
    & r_decimal(r.left) & space 
    & r_decimal(r.top) & space
    & r_decimal(r.right) & space
    & r_decimal(r.bottom) & space
    & ')';

Point t;
auto translate = "translate " & rect 
    & space & r_decimal(t.x) 
    & space & r_decimal(t.y);
// test it
std::string str("translate (rect 10 10 10 10) 50 50");
auto match = translate(str.begin(), str.end());

これにより、PS ファイル内の単一の翻訳ステートメントが解析されます。すべての translate ステートメントを解析する必要があり、postscript 形式の本格的なパーサーを書く必要がない場合は、*r_find(translate)ルールを使用して、気にしない入力をスキップできます。rule は、ルールが見つかるr_find(R)まで入力を検索します。Rこれは非常に簡単で、非常に高速なコードを生成します。おそらく、"if" と "else" を使用して手書きするよりも高速です。

免責事項: 上記のコードはテストしていないため、軽微なエラーが発生する可能性があります。

于 2011-06-01T02:03:01.447 に答える