Date:2010-12-14 23:50:53 (13 years 3 months ago)
Author:Werner Almesberger
Commit:68d5eff7cd3cf4ed29eb1b5f0b2abb0e3c71adf9
Message:cameo: split numbers into dimensions and "bare" numbers

- lang.l, lang.y (MIL2MM): moved unit conversion from lang.l to lang.y
- lang.l, lang.y: instead of returning dimensions and numbers as NUMBER,
return as NUM_EXP_<unit> for numbers with an explicit unit, and as
NUM_IMP_<unit> if the unit is implied
- lang.y (dimen): perform unit conversion as needed
- lang.y (number): never convert and only accept implicit dimensions
- lang.y: change all uses of NUMBER to "dimen", except for the
multipliers in "array", where we can now use "number"
- lang.y: removed comment about "array" only working in metric mode
Files: cameo/lang.l (2 diffs)
cameo/lang.y (6 diffs)

Change Details

cameo/lang.l
2424static int metric = 1;
2525static int file_name_follows = 0;
2626
27
28#define MIL2MM(mil) ((mil)/1000*25.4)
29
3027%}
3128
3229/* file name can contain any characters */
...... 
6966{NUM}mm { yylval.num = strtod(yytext, NULL);
7067                  if (file_name_follows)
7168                    BEGIN(FILENAME);
72                  return NUMBER; }
73{NUM}mil { yylval.num = MIL2MM(strtod(yytext, NULL));
69                  return NUM_EXP_MM; }
70{NUM}mil { yylval.num = strtod(yytext, NULL);
7471                  if (file_name_follows)
7572                    BEGIN(FILENAME);
76                  return NUMBER; }
73                  return NUM_EXP_MIL; }
7774{NUM} { yylval.num = strtod(yytext, NULL);
78                  if (!metric)
79                    yylval.num = MIL2MM(yylval.num);
8075                  if (file_name_follows)
8176                    BEGIN(FILENAME);
82                  return NUMBER; }
77                  return metric ? NUM_IMP_MM : NUM_IMP_MIL; }
8378
8479<FILENAME>[^ \t\n]+([^\t\n]*[^ \t\n]+)? {
8580                  BEGIN(INITIAL);
cameo/lang.y
2626static struct path *paths = NULL;
2727
2828
29#define MIL2MM(mil) ((mil)/1000*25.4)
30
31
2932static void add_paths(struct path *new)
3033{
3134    struct path **anchor = &paths;
...... 
118121%token TOK_GERBER TOK_GNUPLOT TOK_WRITE
119122%token TOK_DOG
120123
121%token <num> NUMBER REF
124%token <num> NUM_EXP_MIL NUM_EXP_MM NUM_IMP_MIL NUM_IMP_MM REF
122125%token <str> STRING
123126
124127%type <str> opt_filename
128%type <num> dimen number
125129
126130%%
127131
...... 
130134    ;
131135
132136command:
133    TOK_ALIGN REF NUMBER NUMBER
137    TOK_ALIGN REF dimen dimen
134138        {
135139            align((int) $2, $3, $4);
136140        }
137    | TOK_ALIGN REF NUMBER NUMBER NUMBER NUMBER
141    | TOK_ALIGN REF dimen dimen dimen dimen
138142        {
139143            int ref = $2;
140144            double x, y;
...... 
147151            ref_pick_xy(ref, $3, $4, $5, $6, &x, &y);
148152            align(ref, x, y);
149153        }
150    | TOK_ARRAY NUMBER NUMBER NUMBER NUMBER
154    | TOK_ARRAY dimen dimen number number
151155        {
152156            double x = $2*$4;
153157            double y = $3*$5;
154158
155            /* @@@ known bug: doesn't work if not in metric mode */
156159            translate(x, y, 0);
157160        }
158161    | TOK_CLEAR
...... 
177180        {
178181            tool_comp_paths(paths, 1);
179182        }
180    | TOK_TRANSLATE NUMBER NUMBER
183    | TOK_TRANSLATE dimen dimen
181184        {
182185            translate($2, $3, 0);
183186            xo += $2;
184187            yo += $3;
185188        }
186    | TOK_Z NUMBER
189    | TOK_Z dimen
187190        {
188191            zo += $2;
189192        }
190    | TOK_Z NUMBER NUMBER
193    | TOK_Z dimen dimen
191194        {
192195            zo += $3-$2;
193196        }
194    | TOK_GERBER NUMBER opt_filename
197    | TOK_GERBER dimen opt_filename
195198        {
196199            add_paths(gerber_read($3, $2/2));
197200            translate(xo, yo, 0);
198201        }
199    | TOK_GNUPLOT NUMBER opt_filename
202    | TOK_GNUPLOT dimen opt_filename
200203        {
201204            add_paths(gnuplot_read($3, $2/2));
202205            translate(xo, yo, 0);
...... 
218221            $$ = $1;
219222        }
220223    ;
224
225dimen:
226    NUM_EXP_MM
227        {
228            $$ = $1;
229        }
230    | NUM_IMP_MM
231        {
232            $$ = $1;
233        }
234    | NUM_EXP_MIL
235        {
236            $$ = MIL2MM($1);
237        }
238    | NUM_IMP_MIL
239        {
240            $$ = MIL2MM($1);
241        }
242    ;
243
244number:
245    NUM_IMP_MIL
246        {
247            $$ = $1;
248        }
249    | NUM_IMP_MM
250        {
251            $$ = $1;
252        }
253    ;

Archive Download the corresponding diff file

Branches:
master



interactive