source: trunk/orbital/mesh.yy @ 1419

Last change on this file since 1419 was 1419, checked in by sam, 11 years ago

orbital: a lot of scanner and parser refactoring to simplify the source
files and allow to build on MSVC soon.

File size: 4.9 KB
Line 
1%{
2//
3// Orbital
4//
5// Copyright: (c) 2012 Various People
6//
7
8#if defined HAVE_CONFIG_H
9#   include "config.h"
10#endif
11
12#include "core.h"
13#include "loldebug.h"
14
15using namespace lol;
16
17#include "mesh.h"
18
19#include <stdio.h>
20#include <string>
21#include <vector>
22%}
23
24%require "2.3"
25%debug
26%defines
27%skeleton "lalr1.cc"
28%name-prefix="orbital"
29%define parser_class_name "MeshParser"
30%locations
31%parse-param { class Driver& driver }
32%error-verbose
33
34%union
35{
36    float fval;
37    struct { float f0, f1, f2, f3, f4, f5, f6, f7; } args;
38}
39
40%start mesh_description
41
42%token T_FLUSH T_INITRB T_FREERB
43
44%token T_COLOR T_BGCOLOR
45
46%token T_TRANSLATEX T_ROTATEX T_TAPERX T_SCALEX T_MIRRORX
47%token T_TRANSLATEY T_ROTATEY T_TAPERY T_SCALEY T_MIRRORY
48%token T_TRANSLATEZ T_ROTATEZ T_TAPERZ T_SCALEZ T_MIRRORZ
49%token T_TRANSLATE T_SCALE
50
51%token T_CYLINDER T_BOX T_SMOOTHCHAMFBOX T_FLATCHAMFBOX T_SPHERE T_STAR
52%token T_EXPANDEDSTAR T_DISC T_TRIANGLE T_QUAD T_COG
53
54%token T_END 0
55
56%token <fval> NUMBER
57
58%type <fval> number
59%type <args> args1 args2 args3 args4 args5 args6 args7 args8
60
61%{
62#include "mesh-driver.h"
63#include "mesh-scanner.h"
64
65#undef yylex
66#define yylex driver.m_lexer->lex
67%}
68
69%%
70
71mesh_description:
72    mesh_command_list T_END
73    ;
74
75mesh_command_list:
76    mesh_command
77  | mesh_command_list ',' mesh_command
78    ;
79
80mesh_command:
81    rb_command
82  | color_command
83  | transform_command
84  | primitive_command
85    ;
86
87rb_command:
88    T_FLUSH    { driver.m_mesh.Flush(); }
89  | T_INITRB   { driver.m_mesh.MeshConvert(); }
90  | T_FREERB   { /* TODO */ }
91    ;
92
93color_command:
94    T_COLOR args4   { driver.m_mesh.SetCurColor(vec4($2.f0, $2.f1, $2.f2, $2.f3)); }
95  | T_BGCOLOR args4 { driver.m_mesh.SetCurColor2(vec4($2.f0, $2.f1, $2.f2, $2.f3)); }
96    ;
97
98transform_command:
99    T_TRANSLATEX args1  { driver.m_mesh.Translate(vec3($2.f0, 0, 0)); }
100  | T_TRANSLATEY args1  { driver.m_mesh.Translate(vec3(0, $2.f0, 0)); }
101  | T_TRANSLATEZ args1  { driver.m_mesh.Translate(vec3(0, 0, $2.f0)); }
102  | T_TRANSLATE args3   { driver.m_mesh.Translate(vec3($2.f0, $2.f1, $2.f2)); }
103  | T_ROTATEX args1     { driver.m_mesh.RotateX($2.f0); }
104  | T_ROTATEY args1     { driver.m_mesh.RotateY($2.f0); }
105  | T_ROTATEZ args1     { driver.m_mesh.RotateZ($2.f0); }
106  | T_TAPERX args3      { driver.m_mesh.TaperX($2.f0, $2.f1, $2.f2); }
107  | T_TAPERY args3      { driver.m_mesh.TaperY($2.f0, $2.f1, $2.f2); }
108  | T_TAPERZ args3      { driver.m_mesh.TaperZ($2.f0, $2.f1, $2.f2); }
109  | T_SCALEX args1      { driver.m_mesh.Scale(vec3($2.f0, 0, 0)); }
110  | T_SCALEY args1      { driver.m_mesh.Scale(vec3(0, $2.f0, 0)); }
111  | T_SCALEZ args1      { driver.m_mesh.Scale(vec3(0, 0, $2.f0)); }
112  | T_SCALE args3       { driver.m_mesh.Scale(vec3($2.f0, $2.f1, $2.f2)); }
113  | T_MIRRORX           { driver.m_mesh.MirrorX(); }
114  | T_MIRRORY           { driver.m_mesh.MirrorY(); }
115  | T_MIRRORZ           { driver.m_mesh.MirrorZ(); }
116    ;
117
118primitive_command:
119    T_CYLINDER args6       { driver.m_mesh.AppendCylinder((int)$2.f0, $2.f1,
120                                                 $2.f2, $2.f3,
121                                                 (int)$2.f4, (int)$2.f5); }
122  | T_BOX args3            { driver.m_mesh.AppendBox(vec3($2.f0, $2.f1, $2.f2)); }
123  | T_SMOOTHCHAMFBOX args4 { driver.m_mesh.AppendSmoothChamfBox(vec3($2.f0, $2.f1,
124                                                            $2.f2), $2.f3); }
125  | T_FLATCHAMFBOX args4   { driver.m_mesh.AppendFlatChamfBox(vec3($2.f0, $2.f1,
126                                                          $2.f2), $2.f3); }
127  | T_SPHERE args4         { driver.m_mesh.AppendSphere($2.f0,
128                                               vec3($2.f1, $2.f2, $2.f3)); }
129  | T_STAR args5           { driver.m_mesh.AppendStar((int)$2.f0, $2.f1, $2.f2,
130                                             (int)$2.f3, (int)$2.f4); }
131  | T_EXPANDEDSTAR args4   { driver.m_mesh.AppendExpandedStar((int)$2.f0, $2.f1,
132                                                     $2.f2, $2.f3); }
133  | T_DISC args3           { driver.m_mesh.AppendDisc((int)$2.f0, $2.f1, (int)$2.f2); }
134  | T_TRIANGLE args2       { driver.m_mesh.AppendSimpleTriangle($2.f0, (int)$2.f1); }
135  | T_QUAD args2           { driver.m_mesh.AppendSimpleQuad($2.f0, (int)$2.f1); }
136  | T_COG args8            { driver.m_mesh.AppendCog((int)$2.f0, $2.f1, $2.f2, $2.f3,
137                                            $2.f4, $2.f5, $2.f6, (int)$2.f7); }
138    ;
139
140args1: number { $$.f0 = $1; } ;
141args2: args1 ',' number { $$ = $1; $$.f1 = $3; } ;
142args3: args2 ',' number { $$ = $1; $$.f2 = $3; } ;
143args4: args3 ',' number { $$ = $1; $$.f3 = $3; } ;
144args5: args4 ',' number { $$ = $1; $$.f4 = $3; } ;
145args6: args5 ',' number { $$ = $1; $$.f5 = $3; } ;
146args7: args6 ',' number { $$ = $1; $$.f6 = $3; } ;
147args8: args7 ',' number { $$ = $1; $$.f7 = $3; } ;
148
149number:
150    NUMBER       { $$ = $1; }
151  | '-' number   { $$ = -$2; }
152    ;
153
154%%
155
156void orbital::MeshParser::error(const MeshParser::location_type& l,
157                                const std::string& m)
158{
159    driver.Error(l, m);
160}
161
Note: See TracBrowser for help on using the repository browser.