Root/
1 | %{ |
2 | /* |
3 | * lang.l - Toolpath adaptation language |
4 | * |
5 | * Written 2010-2013, 2015 by Werner Almesberger |
6 | * Copyright 2010-2013, 2015 by Werner Almesberger |
7 | * |
8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. |
12 | */ |
13 | |
14 | |
15 | #include <stdlib.h> |
16 | #include <stdio.h> |
17 | |
18 | #include "y.tab.h" |
19 | |
20 | |
21 | void yyerror(const char *s); |
22 | |
23 | static int lineno = 1; |
24 | static int metric = 1; |
25 | static int file_name_follows = 0; |
26 | |
27 | %} |
28 | |
29 | /* file name can contain any characters */ |
30 | %s FILENAME |
31 | |
32 | /* "align" has a one-digit argument we don't want to subject to unit |
33 | conversion */ |
34 | %s DIGIT |
35 | |
36 | NUM -?[0-9]+\.?[0-9]* |
37 | |
38 | %% |
39 | |
40 | |
41 | <INITIAL>align { BEGIN(DIGIT); |
42 | return TOK_ALIGN; } |
43 | <INITIAL>area return TOK_AREA; |
44 | <INITIAL>array return TOK_ARRAY; |
45 | <INITIAL>clear return TOK_CLEAR; |
46 | <INITIAL>drill return TOK_DRILL; |
47 | <INITIAL>empty return TOK_EMPTY; |
48 | <INITIAL>flip return TOK_FLIP; |
49 | <INITIAL>keep return TOK_KEEP; |
50 | <INITIAL>mill return TOK_MILL; |
51 | <INITIAL>offset return TOK_OFFSET; |
52 | <INITIAL>optimize return TOK_OPTIMIZE; |
53 | <INITIAL>outside return TOK_OUTSIDE; |
54 | <INITIAL>purge return TOK_PURGE; |
55 | <INITIAL>remainder return TOK_REMAINDER; |
56 | <INITIAL>remove return TOK_REMOVE; |
57 | <INITIAL>reset return TOK_RESET; |
58 | <INITIAL>reverse return TOK_REVERSE; |
59 | <INITIAL>rotate return TOK_ROTATE; |
60 | <INITIAL>stats return TOK_STATS; |
61 | <INITIAL>translate return TOK_TRANSLATE; |
62 | <INITIAL>x return TOK_X; |
63 | <INITIAL>y return TOK_Y; |
64 | <INITIAL>z return TOK_Z; |
65 | |
66 | <INITIAL>append/[ \t\n] { BEGIN(FILENAME); |
67 | return TOK_APPEND; } |
68 | <INITIAL>gerber { file_name_follows = 1; |
69 | return TOK_GERBER; } |
70 | <INITIAL>gnuplot { file_name_follows = 1; |
71 | return TOK_GNUPLOT; } |
72 | <INITIAL>excellon/[ \t\n] { BEGIN(FILENAME); |
73 | return TOK_EXCELLON; } |
74 | <INITIAL>stl/[ \t\n] { BEGIN(FILENAME); |
75 | return TOK_STL; } |
76 | <INITIAL>write/[ \t\n] { BEGIN(FILENAME); |
77 | return TOK_WRITE; } |
78 | <INITIAL>write_gerber/[ \t\n] { BEGIN(FILENAME); |
79 | return TOK_WRITE_GERBER; } |
80 | |
81 | <INITIAL>dog return TOK_DOG; |
82 | <INITIAL>inside return TOK_INSIDE; |
83 | |
84 | <INITIAL>any return TOK_ANY; |
85 | |
86 | <INITIAL>mm metric = 1; |
87 | <INITIAL>mil metric = 0; |
88 | |
89 | <DIGIT>[1-9] { BEGIN(INITIAL); |
90 | yylval.num = strtod(yytext, NULL); |
91 | return REF; } |
92 | |
93 | {NUM}mm { yylval.num = strtod(yytext, NULL); |
94 | if (file_name_follows) |
95 | BEGIN(FILENAME); |
96 | return NUM_EXP_MM; } |
97 | {NUM}mil { yylval.num = strtod(yytext, NULL); |
98 | if (file_name_follows) |
99 | BEGIN(FILENAME); |
100 | return NUM_EXP_MIL; } |
101 | {NUM} { yylval.num = strtod(yytext, NULL); |
102 | if (file_name_follows) |
103 | BEGIN(FILENAME); |
104 | return metric ? NUM_IMP_MM : NUM_IMP_MIL; } |
105 | |
106 | <FILENAME>[^ \t\n]+([^\t\n]*[^ \t\n]+)? { |
107 | BEGIN(INITIAL); |
108 | file_name_follows = 0; |
109 | yylval.str = yytext; |
110 | return STRING; } |
111 | |
112 | [ \t] ; |
113 | \n { BEGIN(INITIAL); |
114 | lineno++; } |
115 | |
116 | ^#\ [0-9]+\ \"[^"]*\"(\ [0-9]+)*\n { |
117 | lineno = strtol(yytext+2, NULL, 0); } |
118 | |
119 | <INITIAL>#.*\n lineno++; |
120 | |
121 | . return *yytext; |
122 | |
123 | %% |
124 | |
125 | void yyerror(const char *s) |
126 | { |
127 | fprintf(stderr, "%d: %s near \"%s\"\n", lineno, s, yytext); |
128 | exit(1); |
129 | } |
130 |
Branches:
master