summaryrefslogtreecommitdiffabout
path: root/lib/sitecing_enflesher.ll
authorMichael Krelin <hacker@klever.net>2005-03-30 21:58:44 (UTC)
committer Michael Krelin <hacker@klever.net>2005-03-30 21:58:44 (UTC)
commit5c757590c7561f6d85b3f9011aa0695c4111b379 (patch) (unidiff)
treee0bf20ca58b3e7bd9cc4eda54db5674ba1d71db0 /lib/sitecing_enflesher.ll
parent3ddbfeafde93d1aab16a710498d86eef4e787406 (diff)
downloadsitecing-5c757590c7561f6d85b3f9011aa0695c4111b379.zip
sitecing-5c757590c7561f6d85b3f9011aa0695c4111b379.tar.gz
sitecing-5c757590c7561f6d85b3f9011aa0695c4111b379.tar.bz2
1. fixed a bug just introduced, preventing the last skeleton-generated file
from being written. 2. introduced pragma directive and pragma main=class 3. minor changes of no importance
Diffstat (limited to 'lib/sitecing_enflesher.ll') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/sitecing_enflesher.ll8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/sitecing_enflesher.ll b/lib/sitecing_enflesher.ll
index 46489c7..bb667be 100644
--- a/lib/sitecing_enflesher.ll
+++ b/lib/sitecing_enflesher.ll
@@ -1,254 +1,260 @@
1%{ 1%{
2#include <iostream> 2#include <iostream>
3#include <fstream> 3#include <fstream>
4#include <cassert> 4#include <cassert>
5#include <stdexcept> 5#include <stdexcept>
6using namespace std; 6using namespace std;
7#include "sitecing/sitecing_exception.h" 7#include "sitecing/sitecing_exception.h"
8using namespace sitecing; 8using namespace sitecing;
9#define sitecing_enflesher_flexlexer_once 9#define sitecing_enflesher_flexlexer_once
10#include "sitecing/sitecing_enflesher.h" 10#include "sitecing/sitecing_enflesher.h"
11#include "sitecing/sitecing_parser.h" 11#include "sitecing/sitecing_parser.h"
12#undef yyFlexLexer 12#undef yyFlexLexer
13#define yyFlexLexer sitecing_enflesherFlexLexer 13#define yyFlexLexer sitecing_enflesherFlexLexer
14%} 14%}
15%option 8bit c++ verbose noyywrap yyclass="sitecing_enflesher" yylineno prefix="sitecing_enflesher" stack debug 15%option 8bit c++ verbose noyywrap yyclass="sitecing_enflesher" yylineno prefix="sitecing_enflesher" stack debug
16 16
17 ID[A-Za-z_][A-Za-z0-9_]* 17 ID[A-Za-z_][A-Za-z0-9_]*
18 18
19%% 19%%
20 20
21 ^\%\%\#[^\n]+\n{ 21 ^\%\%\#[^\n]+\n{
22 string line = yytext; 22 string line = yytext;
23 line.erase(0,3); 23 line.erase(0,3);
24 line.erase(line.length()-1); 24 line.erase(line.length()-1);
25 outs_open(parser.output_basename+line); 25 outs_open(parser.output_basename+line);
26 anchor(); 26 anchor();
27 anchoraged = true; 27 anchoraged = true;
28} 28}
29 ^\%\%[^\n]+\n{ 29 ^\%\%[^\n]+\n{
30 string line = yytext; 30 string line = yytext;
31 line.erase(0,2); 31 line.erase(0,2);
32 line.erase(line.length()-1); 32 line.erase(line.length()-1);
33 outs_open(parser.output_basename+line); 33 outs_open(parser.output_basename+line);
34 anchoraged = false; 34 anchoraged = false;
35} 35}
36 36
37 \<\%component_basename\%\>outs << parser.component_basename; anchor_time = true; 37 \<\%component_basename\%\>outs << parser.component_basename; anchor_time = true;
38 \<\%impl\%\> outs << parser.impl; anchor_time = true; 38 \<\%impl\%\> outs << parser.impl; anchor_time = true;
39 \<\%member_functions:impl\%\>{ 39 \<\%member_functions:impl\%\>{
40 for(sitecing_parser::member_functions_t::const_iterator i=parser.member_functions.begin();i!=parser.member_functions.end();i++) { 40 for(sitecing_parser::member_functions_t::const_iterator i=parser.member_functions.begin();i!=parser.member_functions.end();i++) {
41 outs << i->type << " " << parser.class_name << "::"; 41 outs << i->type << " " << parser.class_name << "::";
42 if(i->name.empty()) { 42 if(i->name.empty()) {
43 outs << parser.class_name << "()"; 43 outs << parser.class_name << "()";
44 bool first = true; 44 bool first = true;
45 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) { 45 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) {
46 if(i->initializer.empty()) 46 if(i->initializer.empty())
47 continue; 47 continue;
48 if(first) { 48 if(first) {
49 outs << ":"; 49 outs << ":";
50 first=false; 50 first=false;
51 }else{ 51 }else{
52 outs << ","; 52 outs << ",";
53 } 53 }
54 if(i->bComponent) { 54 if(i->bComponent) {
55 outs << i->name << "(NULL)"; 55 outs << i->name << "(NULL)";
56 }else { 56 }else {
57 outs << i->name << "(" << i->initializer << ")"; 57 outs << i->name << "(" << i->initializer << ")";
58 } 58 }
59 } 59 }
60 }else if(i->name == "~") 60 }else if(i->name == "~")
61 outs << "~" << parser.class_name << "()"; 61 outs << "~" << parser.class_name << "()";
62 else 62 else
63 outs << i->name << i->args; 63 outs << i->name << i->args;
64 outs << "{\n" << i->body << "\n}\n"; 64 outs << "{\n" << i->body << "\n}\n";
65 } 65 }
66 anchor_time = true; 66 anchor_time = true;
67} 67}
68 \<\%class_name\%\> outs << parser.class_name; anchor_time = true; 68 \<\%class_name\%\> outs << parser.class_name; anchor_time = true;
69 \<\%baseclass_header\%\>outs << parser.base_header; anchor_time = true; 69 \<\%baseclass_header\%\>outs << parser.base_header; anchor_time = true;
70 \<\%decl\%\> outs << parser.decl; anchor_time = true; 70 \<\%decl\%\> outs << parser.decl; anchor_time = true;
71 \<\%baseclass_name\%\> outs << parser.base_class; anchor_time = true; 71 \<\%baseclass_name\%\> outs << parser.base_class; anchor_time = true;
72 \<\%member_variables:decl\%\>{ 72 \<\%member_variables:decl\%\>{
73 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) { 73 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) {
74 if(i->bComponent) { 74 if(i->bComponent) {
75 if(i->type.empty()) { 75 if(i->type.empty()) {
76 i->type = parser.factory.get_classname(i->initializer); 76 i->type = parser.factory.get_classname(i->initializer);
77 } 77 }
78 if(i->bTypeOnly) { 78 if(i->bTypeOnly) {
79 outs << "typedef " << i->type << " " << i->name << ";\n"; 79 outs << "typedef " << i->type << " " << i->name << ";\n";
80 }else{ 80 }else{
81 outs << "typedef " << i->type << " __type_" << i->name << ";\nsitecing::so_component __soc_" << i->name << ";\n__type_" << i->name << " *" << i->name << ";\n"; 81 outs << "typedef " << i->type << " __type_" << i->name << ";\nsitecing::so_component __soc_" << i->name << ";\n__type_" << i->name << " *" << i->name << ";\n";
82 } 82 }
83 }else{ 83 }else{
84 outs << i->type << " " << i->name << ";\n"; 84 outs << i->type << " " << i->name << ";\n";
85 } 85 }
86 } 86 }
87 anchor_time = true; 87 anchor_time = true;
88} 88}
89 \<\%member_functions:decl\%\>{ 89 \<\%member_functions:decl\%\>{
90 for(sitecing_parser::member_functions_t::const_iterator i=parser.member_functions.begin();i!=parser.member_functions.end();i++) { 90 for(sitecing_parser::member_functions_t::const_iterator i=parser.member_functions.begin();i!=parser.member_functions.end();i++) {
91 (i->name.empty()?outs:outs << "virtual ") 91 (i->name.empty()?outs:outs << "virtual ")
92 << i->type << " "; 92 << i->type << " ";
93 if(i->name.empty()) { 93 if(i->name.empty()) {
94 outs << parser.class_name << "()"; 94 outs << parser.class_name << "()";
95 }else if(i->name == "~") 95 }else if(i->name == "~")
96 outs << "~" << parser.class_name << "()"; 96 outs << "~" << parser.class_name << "()";
97 else 97 else
98 outs << i->name << i->args; 98 outs << i->name << i->args;
99 outs << ";\n"; 99 outs << ";\n";
100 } 100 }
101 anchor_time = true; 101 anchor_time = true;
102} 102}
103 \<\%imports:list\%\> { 103 \<\%imports:list\%\> {
104 for(sitecing_parser::member_variables_t::const_iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) { 104 for(sitecing_parser::member_variables_t::const_iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) {
105 if(i->bComponent) 105 if(i->bComponent)
106 outs << i->initializer << endl; 106 outs << i->initializer << endl;
107 } 107 }
108 anchor_time = true; 108 anchor_time = true;
109} 109}
110 \<\%imports:includes\%\>{ 110 \<\%imports:includes\%\>{
111 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) { 111 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) {
112 if(i->bComponent) 112 if(i->bComponent)
113 outs << "\n#include \"" << i->initializer << ".h\"\n"; 113 outs << "\n#include \"" << i->initializer << ".h\"\n";
114 } 114 }
115 anchor_time = true; 115 anchor_time = true;
116} 116}
117 \<\%imports:import\%\>{ 117 \<\%imports:import\%\>{
118 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) { 118 for(sitecing_parser::member_variables_t::iterator i=parser.member_variables.begin();i!=parser.member_variables.end();i++) {
119 if(!i->bComponent) 119 if(!i->bComponent)
120 continue; 120 continue;
121 if(i->bTypeOnly) 121 if(i->bTypeOnly)
122 continue; 122 continue;
123 outs << "__soc_" << i->name << "=__SCIF->ss->fetch(\"" << i->initializer << "\",__SCIF); " << i->name << "=static_cast<__type_" << i->name << "*>(__soc_" << i->name << ".ac->__the_most_derived_this());\n"; 123 outs << "__soc_" << i->name << "=__SCIF->ss->fetch(\"" << i->initializer << "\",__SCIF); " << i->name << "=static_cast<__type_" << i->name << "*>(__soc_" << i->name << ".ac->__the_most_derived_this());\n";
124 } 124 }
125 anchor_time = true; 125 anchor_time = true;
126} 126}
127 127
128 \<\%base_component\%\> { 128 \<\%base_component\%\> {
129 // TODO: 129 // TODO:
130 anchor_time = true; 130 anchor_time = true;
131} 131}
132 132
133 \<\%ancestors:includes\%\>{ 133 \<\%ancestors:includes\%\>{
134 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) { 134 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) {
135 outs << "#include \"" << i->path << ".h\"\n"; 135 outs << "#include \"" << i->path << ".h\"\n";
136 } 136 }
137 anchor_time = true; 137 anchor_time = true;
138} 138}
139 \<\%ancestors:component_list\%\>{ 139 \<\%ancestors:component_list\%\>{
140 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) { 140 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) {
141 outs << i->path << "\n"; 141 outs << i->path << "\n";
142 } 142 }
143 anchor_time = true; 143 anchor_time = true;
144} 144}
145 \<\%ancestors:base_clause_part\%\>{ 145 \<\%ancestors:base_clause_part\%\>{
146 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) { 146 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) {
147 outs << ", virtual public " << parser.factory.get_classname(i->path); 147 outs << ", virtual public " << parser.factory.get_classname(i->path);
148 } 148 }
149} 149}
150 \<\%ancestors:typedefs\%\> { 150 \<\%ancestors:typedefs\%\> {
151 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) { 151 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) {
152 outs << "typedef class " << parser.factory.get_classname(i->path) << " " << i->name << ";\n"; 152 outs << "typedef class " << parser.factory.get_classname(i->path) << " " << i->name << ";\n";
153 } 153 }
154 anchor_time = true; 154 anchor_time = true;
155} 155}
156 \<\%ancestors:import\%\> { 156 \<\%ancestors:import\%\> {
157 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) { 157 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) {
158 outs << i->name << "::__do_imports();\n"; 158 outs << i->name << "::__do_imports();\n";
159 } 159 }
160 anchor_time = true; 160 anchor_time = true;
161} 161}
162 162
163 \n { 163 \n {
164 if(anchor_time) 164 if(anchor_time)
165 anchor(); 165 anchor();
166 ECHO; 166 ECHO;
167} 167}
168 . ECHO; 168 . ECHO;
169 169
170%% 170%%
171 171
172void sitecing_enflesher::LexerOutput(const char *buf,int size) { 172void sitecing_enflesher::LexerOutput(const char *buf,int size) {
173 outs.write(buf,size); 173 outs.write(buf,size);
174} 174}
175 175
176void sitecing_enflesher::enflesh() { 176void sitecing_enflesher::enflesh() {
177 ifstream ifs(parser.skeleton.c_str()); 177 ifstream ifs(parser.skeleton.c_str());
178 if(!ifs.good()) 178 if(!ifs.good())
179 throw preprocessor_error(CODEPOINT,"failed to open skeleton file"); 179 throw preprocessor_error(CODEPOINT,"failed to open skeleton file");
180 switch_streams(&ifs,NULL); 180 switch_streams(&ifs,NULL);
181 yylex(); 181 yylex();
182 outs_close();
182} 183}
183 184
184void sitecing_enflesher::anchor() { 185void sitecing_enflesher::anchor() {
185 if(!anchoraged) 186 if(!anchoraged)
186 return; 187 return;
187 outs << "\n#line " << lineno() << " \"" << parser.skeleton << "\"\n"; 188 outs << "\n#line " << lineno() << " \"" << parser.skeleton << "\"\n";
188 anchor_time = false; 189 anchor_time = false;
189} 190}
190 191
191void sitecing_enflesher::outs_open(const string& nfile) { 192void sitecing_enflesher::outs_close() {
192 if(!outs_filename.empty()) { 193 if(!outs_filename.empty()) {
193 outs.flush(); 194 outs.flush();
194 outs.close(); 195 outs.close();
195 outs.clear(); 196 outs.clear();
196 /* 197 /*
197 * compare source and destination files. 198 * compare source and destination files.
198 * 199 *
199 * one can also keep a hash for the old one and compute one for the 200 * one can also keep a hash for the old one and compute one for the
200 * output while writing, but I'm not sure if it's any better. Surely a 201 * output while writing, but I'm not sure if it's any better. Surely a
201 * bit less accurate, unless we're going to compare it in case of 202 * bit less accurate, unless we're going to compare it in case of
202 * difference, anyway. 203 * difference, anyway.
203 */ 204 */
204 bool overwrite = false; 205 bool overwrite = false;
205 struct stat st_s, st_d; 206 struct stat st_s, st_d;
206 string fn_s = outs_filename+".new"; 207 string fn_s = outs_filename+".new";
207 string fn_d = outs_filename; 208 string fn_d = outs_filename;
208 if(stat(fn_d.c_str(),&st_d)) { 209 if(stat(fn_d.c_str(),&st_d)) {
209 overwrite = true; 210 overwrite = true;
210 }else{ 211 }else{
211 if(stat(fn_s.c_str(),&st_s)) 212 if(stat(fn_s.c_str(),&st_s))
212 throw preprocessor_error(CODEPOINT,"failed to stat() supposedly created file"); 213 throw preprocessor_error(CODEPOINT,"failed to stat() supposedly created file");
213 if(st_s.st_size!=st_d.st_size) { 214 if(st_s.st_size!=st_d.st_size) {
214 overwrite = true; 215 overwrite = true;
215 }else{ 216 }else{
216 ifstream i_s(fn_s.c_str(),ios::in); 217 ifstream i_s(fn_s.c_str(),ios::in);
217 if(!i_s) 218 if(!i_s)
218 throw preprocessor_error(CODEPOINT,"failed to open supposedly created file"); 219 throw preprocessor_error(CODEPOINT,"failed to open supposedly created file");
219 ifstream i_d(fn_d.c_str(),ios::in); 220 ifstream i_d(fn_d.c_str(),ios::in);
220 if(!i_d) 221 if(!i_d)
221 throw preprocessor_error(CODEPOINT,"failed to open the old preprocessed source"); 222 throw preprocessor_error(CODEPOINT,"failed to open the old preprocessed source");
222 off_t remaining = st_s.st_size; 223 off_t remaining = st_s.st_size;
223 char t1[2048]; 224 char t1[2048];
224 char t2[sizeof(t1)]; 225 char t2[sizeof(t1)];
225 while(remaining) { 226 while(remaining) {
226 int rb = remaining; 227 int rb = remaining;
227 if(rb>sizeof(t1)) 228 if(rb>sizeof(t1))
228 rb = sizeof(t1); 229 rb = sizeof(t1);
229 if(i_s.read(t1,rb).gcount()!=rb) 230 if(i_s.read(t1,rb).gcount()!=rb)
230 throw preprocessor_error(CODEPOINT,"error reading just created file"); 231 throw preprocessor_error(CODEPOINT,"error reading just created file");
231 if(i_d.read(t2,rb).gcount()!=rb) 232 if(i_d.read(t2,rb).gcount()!=rb)
232 throw preprocessor_error(CODEPOINT,"error reading the old preprocessed source"); 233 throw preprocessor_error(CODEPOINT,"error reading the old preprocessed source");
233 if(memcmp(t1,t2,rb)) { 234 if(memcmp(t1,t2,rb)) {
234 overwrite = true; 235 overwrite = true;
235 break; 236 break;
236 } 237 }
237 remaining -= rb; 238 remaining -= rb;
238 } 239 }
239 } 240 }
240 } 241 }
241 if(overwrite) { 242 if(overwrite) {
242 cerr << "renaming '" << fn_s << "'" << endl; 243 cerr << "renaming '" << fn_s << "'" << endl;
243 if(rename(fn_s.c_str(),fn_d.c_str())) 244 if(rename(fn_s.c_str(),fn_d.c_str()))
244 throw preprocessor_error(CODEPOINT,"failed to rename() generated output"); 245 throw preprocessor_error(CODEPOINT,"failed to rename() generated output");
245 } 246 }
246 } 247 }
248 outs_filename.erase();
249}
250
251void sitecing_enflesher::outs_open(const string& nfile) {
252 outs_close();
247 outs_filename = nfile; 253 outs_filename = nfile;
248 outs.open((nfile+".new").c_str(),ios::trunc); 254 outs.open((nfile+".new").c_str(),ios::trunc);
249 if(!outs.good()) 255 if(!outs.good())
250 throw preprocessor_error(CODEPOINT,"failed to write preprocessor output"); 256 throw preprocessor_error(CODEPOINT,"failed to write preprocessor output");
251} 257}
252/* 258/*
253 * vim:set ft=lex: 259 * vim:set ft=lex:
254 */ 260 */