1

当预先知道 N 时,flex/bison 是否适合解析包含由表示 x、y、z 坐标的三个浮点数组成的 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)。如果您发现需要将工具扩展到可变数量的维度,您可能会发现在您定义的顶点的每个浮点列表之间引入分隔符(如分号)很有用。

根据您的需要,您可能会发现可以使用随每次store_vertex()调用动态增长的数据结构,然后您根本不需要num_vertices在输入文件中声明。

于 2013-03-28T14:47:19.230 回答