1

flex/bison は、N が事前にわかっている場合、x、y、z 座標を表す 3 つの float で構成される N 個の頂点を含むデータ構造の解析に適していますか? もしそうなら、パーサー/レクサーのセットアップはどのようになりますか?

埋めたい構造 (これらの配列を作成します)

struct Vertex
{
   float x;
   float y;
   float z;
};

入力テキスト

Vertices: n
  x1 y1 z1
  x2 y2 z2
  ...
  xN yN zN

私が真実であると想定していること (flex/bison で新しいので、おそらく間違っている)

パーサー定義で定義されたトークン

%token VERTICES_IDENTIFIER
%token COLON
%token NUM

レクサー規則

Vertices { return VERTICES_IDENTIFIER;}
:        { return COLON; }
[0-9]+   |
[0-9]+"."[0-9]* {return NUM;}
4

2 に答える 2

2

文法ファイルを配置しませんでした。だから、私は次のようなものだと思います:

%{
int num_vertices, idx;
%}
...
%%
file: VERTICES_IDENTIFIER ':' NUM { num_vertices = $3; idx = 0; }
    | NUM NUM NUM             { set_vertice(idx++, $1, $2, $3); }
    ;

..そして関数を書くset_vertice(no, x, y, z);

于 2013-03-28T13:47:54.867 に答える
1

パーサー ルールは、@xtof pernaud から適応して、次のようになります。定義のリストは再帰的に定義されます。

%{
int num_vertices;
int idx;
%}
...

program : count_definition vertex_definitions { /* check that the number of vertices 
                                                   stored = num_vertices */ 
                                              }
        ;

count_definition : VERTICES_IDENTIFIER COLON NUM { num_vertices = $3; idx = 0; 
                                                   /* allocate data structure */ 
                                                 }
                 ;

vertex_definitions : vertex_definitions vertex_definition
                   | vertex_definition
                   ;

vertex_definition : NUM NUM NUM { /* check that idx does not exceed num_vertices */
                                  store_vertex(idx++, $1, $2, $3); 
                                }

質問を最初に読んだとき、次元の数 (3) は可変であり、点 (頂点) の数 (N) も可変であると思いました。ツールをさまざまな次元数に拡張する必要がある場合は、定義している頂点の float の各リストの間に区切り記号 (セミコロンなど) を導入すると便利な場合があります。

必要に応じて、呼び出しごとに動的に成長するデータ構造を使用できる場合があり、入力ファイルでstore_vertex()宣言する必要はまったくありません。num_vertices

于 2013-03-28T14:47:19.230 に答える