abc プロジェクト
関数名 | Pass1 |
定義ファイル名 | pass1.cpp |
定義行 | 50 |
宣言形式 | void Pass1 ( AnsiString SrcFileName , TList * TokenList ) |
概要 | トークンリストを生成する。 生成したトークンは、TokenListに追加される。 |
戻り値 | なし |
パラメタ説明 | SrcFileName ソースファイル名 TokenList 生成したトークンの格納先 |
機能説明 | |
備考 | |
呼出し元関数一覧表
呼出し先関数一覧表
|
名称 |
定義ファイル名 |
定義行 |
1 |
TMainF::err |
main.cpp |
271 |
2 |
Add |
|
|
3 |
AnsiString |
|
|
4 |
Delete |
|
|
5 |
IntToStr |
|
|
6 |
Last |
|
|
7 |
printf |
|
|
8 |
Read |
|
|
9 |
strchr |
|
|
参照外部変数一覧表
参照先一覧表
関数論理チャート
| +------------------------------------------------------+
50 +--+ void Pass1(AnsiString SrcFileName,TList *TokenList) |
51 | { |
+--+---------------------------------------------------+
52 +--- int pos,size;
53 +--- TFileStream *Stream;
54 +--- char c,cBuff[1024],TokBuff[1024];
55 +--- int cBuffPos = 0;
56 +--- int TokBuffPos = 0;
57 +--- AnsiString TokStr;
58 +--- AnsiString s;
59 |
60 +--- Stream = new TFileStream(SrcFileName,fmOpenRead);
61 +--- size = Stream->Size;
62 +--- CurLineNo = 1;
63 +--- CurPos = 0;
64 |
| +------------------------------------+
65 +--+ for(pos = 0 ; pos < size ; pos++){ |
| +--+---------------------------------+
66 | +--- Stream->Read(&c,sizeof(c));
67 | +--- // if(c == '/* TODO : */:'){
68 | | // MainF->print(IntToStr(pos));
69 | | // }
70 | |
| | +----------------------------------------------------------------------+
71 | +--+ if(c == '\t'){ // もし、TABが入っていたら、Err,スペース1つにする。 |
| | +--+-------------------------------------------------------------------+
72 | | +--- // TABの部分を [TAB]に変えた1行を表示したい。
73 | | +--- cBuff[cBuffPos++] = '[';
74 | | +--- cBuff[cBuffPos++] = 'T';
75 | | +--- cBuff[cBuffPos++] = 'A';
76 | | +--- cBuff[cBuffPos++] = 'B';
77 | | +--- cBuff[cBuffPos++] = ']';
| | | +------------------------------------+
78 | | +--+ while((c != '\n')&&(pos < size)){ |
| | | +--+---------------------------------+
79 | | | +--- Stream->Read(&c,sizeof(c));
| | | | +----------------+
80 | | | +--+ if(c == '\t'){ |
| | | | +--+-------------+
81 | | | | +--- cBuff[cBuffPos++] = '[';
82 | | | | +--- cBuff[cBuffPos++] = 'T';
83 | | | | +--- cBuff[cBuffPos++] = 'A';
84 | | | | +--- cBuff[cBuffPos++] = 'B';
85 | | | | +--- cBuff[cBuffPos++] = ']';
| | | | +-+---+
86 | | | | | } |
| | | | +-+---+
| | | | +-+-------+
86 | | | | | else{ |
| | | | +-+-------+
87 | | | | +--- cBuff[cBuffPos++] = c;
| | | | +-+---+
88 | | | | | } |
| | | | +-----+
89 | | | +--- pos++;
| | | +-+---+
90 | | | | } |
| | | +-----+
91 | | +--- cBuff[cBuffPos++] = '\0';
92 | | +--- MainF->err("TAB文字が含まれています。");
93 | | +--- MainF->err("Line = "+IntToStr(CurLineNo));
94 | | +--- MainF->err(cBuff);
95 | | +--- cBuffPos = 0;
96 | | +--- CurLineNo++;
| | | +------------+
97 | | +--+ continue; |
| | | +------------+
| | +-+---+
98 | | | } |
| | +-----+
| | +----------------+
99 | +--+ if(c == '\r'){ |
| | +--+-------------+
| | | +----------------------------------------+
100 | | +--+ continue; // '\r' 0x0d は、無視する。 |
| | | +----------------------------------------+
| | +-+---+
101 | | | } |
| | +-----+
| | +----------------+
102 | +--+ if(c != '\n'){ |
| | +--+-------------+
103 | | +--- //
104 | | | // 継続行のチェックと処理を行う。
105 | | | // 6桁目が 空白か0でなければ、継続行
106 | | | // その前が空白である条件もつけた。
107 | | | //
| | | +----------------------------------------------------------------+
108 | | +--+ if((cBuffPos == 5)&&(c != ' ')&&(c != '0') |
109 | | | | &&(cBuff[0] == ' ')&&(cBuff[1] == ' ') |
110 | | | | &&(cBuff[2] == ' ')&&(cBuff[3] == ' ') |
111 | | | | &&(cBuff[4] == ' ') |
112 | | | | &&(((TToken *)TokenList->Last())->TokId == tid_LineEnd)){ |
| | | +--+-------------------------------------------------------------+
113 | | | +--- TokenList->Delete(TokenList->Count-1); // 最終トークンをCut
114 | | | +--- cBuff[cBuffPos++] = c;
| | | | +----------------------------------------+
115 | | | +--+ continue; // 継続文字を無視して、継続 |
| | | | +----------------------------------------+
| | | +-+---+
116 | | | | } |
| | | +-----+
117 | | +--- cBuff[cBuffPos++] = c;
| | +-+---+
118 | | | } |
| | +-+---+
| | +-+-----------------------------------------------------------------------+
118 | | | else{ // 改行コード '\n' 0x0A (Windowsの場合は、1つ前に 0x0dが来る) |
| | +-+-----------------------------------------------------------------------+
119 | | +--- cBuff[cBuffPos++] = '\0';
120 | | +--- s.printf("%4d:",CurLineNo);
121 | | +--- #if 0
122 | | +--- MainF->print(s+cBuff);
123 | | +--- #endif
124 | | +--- cBuffPos = 0;
125 | | +--- CurLineNo++;
| | +-+---+
126 | | | } |
| | +-----+
127 | +--- //
128 | | // コメント開始かどうかをチェックして、コメントなら終わりまでSkip
129 | | //
| | +--------------------------------------------------------------+
130 | +--+ if(((cBuffPos == 1)&&(((c == 'C')||(c == 'c')||(c == '*')))) |
131 | | | ||(c == '!')){ |
| | +--+-----------------------------------------------------------+
132 | | +--- TokStr = c;
| | | +------------------------------------+
133 | | +--+ while((c != '\n')&&(pos < size)){ |
| | | +--+---------------------------------+
134 | | | +--- Stream->Read(&c,sizeof(c));
135 | | | +--- cBuff[cBuffPos++] = c;
136 | | | +--- TokStr += c;
137 | | | +--- pos++;
| | | +-+---+
138 | | | | } |
| | | +-----+
139 | | +--- // 改行コードの処理
140 | | +--- cBuff[cBuffPos-1] = '\0';
141 | | +--- s.printf("%4d:",CurLineNo);
142 | | +--- #if 0
143 | | +--- MainF->print(s+cBuff);
144 | | +--- #endif
145 | | +--- cBuffPos = 0;
146 | | +--- CurLineNo++;
147 | | |
| | | +------------------------+
148 | | +--+ if(TokStr[1] == '!'){ |
| | | +--+---------------------+
149 | | | +--- CurPos = Stream->Position;
150 | | | +--- TokenList->Add((void *)new TToken(TokStr,tid_Comment1));
151 | | | +--- TokenList->Add((void *)new TToken("",tid_LineEnd));
152 | | | +--- c = '\n'; // 改行コードでの処理を継続 (次がコメント前からの継続行?)
| | | +-+---+
153 | | | | } |
| | | +-+---+
| | | +-+-------+
153 | | | | else{ |
| | | +-+-------+
154 | | | +--- CurPos = Stream->Position;
155 | | | +--- TokenList->Add((void *)new TToken(TokStr,tid_Comment2));
156 | | | +--- TokenList->Add((void *)new TToken("",tid_LineEnd));
| | | | +------------+
157 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
158 | | | | } |
| | | +-----+
| | +-+---+
159 | | | } |
| | +-----+
160 | +--- //
161 | | // 文字列開始かどうかをチェックして文字列なら終わりまでスキップ
162 | | // 継続行があっても、閉じるまで読み続ける。
163 | | // 直前が include キーワードならば、再帰呼び出しで処理を行う。
164 | | //
| | +--------------------------------+
165 | +--+ if((c == '\'')||(c == '\"')){ |
| | +--+-----------------------------+
| | | +----------------------+
166 | | +--+ if(TokBuffPos != 0){ |
| | | +--+-------------------+
167 | | | +--- TokBuff[TokBuffPos] = '\0';
168 | | | +--- TokStr = AnsiString(TokBuff);
| | | | +--------------------+
169 | | | +--+ if(TokStr != ""){ |
| | | | +--+-----------------+
170 | | | | +--- CurPos = Stream->Position;
171 | | | | +--- TokenList->Add((void *)new TToken(TokStr,-1));
| | | | +-+---+
172 | | | | | } |
| | | | +-----+
173 | | | +--- TokBuffPos = 0;
| | | +-+---+
174 | | | | } |
| | | +-----+
175 | | +--- TokStr = c;
| | | +----------------+
176 | | +--+ if(c == '\''){ |
| | | +--+-------------+
| | | | +--------------------+
177 | | | +--+ while(pos < size){ |
| | | | +--+-----------------+
178 | | | | +--- Stream->Read(&c,sizeof(c));
179 | | | | +--- cBuff[cBuffPos++] = c;
| | | | | +----------------+
180 | | | | +--+ if(c == '\''){ |
| | | | | +--+-------------+
181 | | | | | +--- Stream->Read(&c,sizeof(c));
182 | | | | | +--- cBuff[cBuffPos++] = c;
183 | | | | | +--- pos++;
| | | | | | +----------------+
184 | | | | | +--+ if(c != '\''){ |
| | | | | | +--+-------------+
185 | | | | | | +--- TokStr += '\'';
186 | | | | | | +--- Stream->Position = Stream->Position-1; // ひとつ戻る
| | | | | | | +--------+
187 | | | | | | +--+ break; |
| | | | | | | +--------+
| | | | | | +-+---+
188 | | | | | | | } |
| | | | | | +-----+
| | | | | +-+---+
189 | | | | | | } |
| | | | | +-----+
190 | | | | +--- TokStr += c;
191 | | | | +--- pos++;
| | | | +-+---+
192 | | | | | } |
| | | | +-----+
| | | +-+---+
193 | | | | } |
| | | +-+---+
| | | +-+-------+
193 | | | | else{ |
| | | +-+-------+
194 | | | +--- c = 0;
| | | | +------------------------------------+
195 | | | +--+ while((c != '\"')&&(pos < size)){ |
| | | | +--+---------------------------------+
196 | | | | +--- Stream->Read(&c,sizeof(c));
197 | | | | +--- cBuff[cBuffPos++] = c;
198 | | | | +--- TokStr += c;
199 | | | | +--- pos++;
| | | | +-+---+
200 | | | | | } |
| | | | +-----+
| | | +-+---+
201 | | | | } |
| | | +-----+
202 | | +--- CurPos = Stream->Position;
203 | | +--- TokenList->Add((void *)new TToken(TokStr,tid_ConstStr));
204 | | +--- TokBuffPos = 0;
205 | | |
206 | | +--- #if 0 // 現在 includeはSkip もし入れるならば、StrPosの調整と OrgStrの調整が必要となる
207 | | +--- //
208 | | | // もし、1つ前のトークンが includeの場合は、ファイルを開いて再帰で
209 | | | // トークンを追加する。
210 | | | // ファイルが見つからない場合は、Skipする。
211 | | | //
| | | +----------------------------+
212 | | +--+ if(TokenList->Count > 1){ |
| | | +--+-------------------------+
213 | | | +--- TToken *Token;
214 | | | +--- AnsiString FileName;
215 | | | |
216 | | | +--- Token = (TToken *)TokenList->Items[TokenList->Count-2];
| | | | +--------------------------------------------------+
217 | | | +--+ if(AnsiCompareText(Token->Str,"include") == 0){ |
| | | | +--+-----------------------------------------------+
218 | | | | +--- FileName = TokStr.SubString(2,TokStr.Length()-2);
| | | | | +----------------------------+
219 | | | | +--+ if(FileExists(FileName)){ |
| | | | | +--+-------------------------+
220 | | | | | +--- MainF->print("------------ start include "+ TokStr + " --------------");
221 | | | | | +--- Pass1(FileName,TokenList); // 再帰で呼ばれる。
222 | | | | | +--- MainF->print("------------ end include "+ TokStr + " --------------");
| | | | | +-+---+
223 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
224 | | | | | } |
| | | | +-----+
| | | +-+---+
225 | | | | } |
| | | +-----+
226 | | +--- #endif
| | | +------------+
227 | | +--+ continue; |
| | | +------------+
| | +-+---+
228 | | | } |
| | +-----+
229 | +--- //
230 | | // セパレータまで、1つのトークンとして扱う。
231 | | //
| | +------------------------------------+
232 | +--+ if(strchr(TokSepChar,c) == NULL){ |
| | +--+---------------------------------+
233 | | +--- TokBuff[TokBuffPos++] = c;
| | | +------------+
234 | | +--+ continue; |
| | | +------------+
| | +-+---+
235 | | | } |
| | +-----+
236 | |
237 | +--- //
238 | | // セパレータがあったので、そこまでをトークンとして処理する。
239 | | // さらに、セパレータ自身もトークンとして追加する。
240 | | // セパレータ自身のトークン追加は、<=などの演算子の場合があるが、
241 | | // その処理は、TokenListを生成後に行う。(NULLにしてPack()で詰める)
242 | | //
| | +----------------------+
243 | +--+ if(TokBuffPos != 0){ |
| | +--+-------------------+
244 | | +--- TokBuff[TokBuffPos] = '\0';
245 | | +--- TokStr = AnsiString(TokBuff);
| | | +--------------------+
246 | | +--+ if(TokStr != ""){ |
| | | +--+-----------------+
247 | | | +--- CurPos = Stream->Position-1;
248 | | | +--- TokenList->Add((void *)new TToken(TokStr,-1));
| | | +-+---+
249 | | | | } |
| | | +-----+
250 | | +--- TokBuffPos = 0;
| | +-+---+
251 | | | } |
| | +-----+
| | +----------------+
252 | +--+ if(c != ' '){ |
| | +--+-------------+
253 | | +--- //
254 | | | // & 継続行のチェックと処理を行う。
255 | | | // 1)行の最後が & で終わっていれば、継続行
256 | | | // さらに次の行の先頭位置が&ならば、そこまでSkip
257 | | | // 改行コードまでは、トークンとして処理済みとする。
258 | | | //
| | | +----------------+
259 | | +--+ if(c == '\n'){ |
| | | +--+-------------+
| | | | +------------------------------------------------+
260 | | | +--+ if(((TToken *)TokenList->Last())->Str == "&"){ |
| | | | +--+---------------------------------------------+
261 | | | | +--- c = 0;
| | | | | +----------------------------------+
262 | | | | +--+ while((c != ' ')&&(pos < size)){ |
| | | | | +--+-------------------------------+
263 | | | | | +--- Stream->Read(&c,sizeof(c));
264 | | | | | +--- cBuff[cBuffPos++] = c;
| | | | | | +----------------+
265 | | | | | +--+ if(c == '&'){ |
| | | | | | +--+-------------+
266 | | | | | | +--- TokBuffPos = 0;
| | | | | | | +--------+
267 | | | | | | +--+ break; |
| | | | | | | +--------+
| | | | | | +-+---+
268 | | | | | | | } |
| | | | | | +-----+
269 | | | | | +--- TokBuff[TokBuffPos++] = c;
270 | | | | | +--- pos++;
| | | | | +-+---+
271 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
272 | | | | | } |
| | | | +-+---+
| | | | +-+-------+
272 | | | | | else{ |
| | | | +-+-------+
| | | | | +------------------------------------------------------------+
273 | | | | +--+ if(((TToken *)TokenList->Last())->TokId != tid_LineEnd ){ |
| | | | | +--+---------------------------------------------------------+
274 | | | | | +--- CurPos = Stream->Position;
275 | | | | | +--- TokenList->Add((void *)new TToken(c,tid_LineEnd));
| | | | | +-+---+
276 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
277 | | | | | } |
| | | | +-----+
278 | | | +--- /*
279 | | | | :: については、void Pass1_2(TList *TokenList) でのトークン結合に修正
280 | | | | OrgStrの所得に問題があったため。 修正。2007/1/19
281 | | | |
282 | | | | }else if((c == ':')&&(((TToken *)TokenList->Last())->Str == ":")){
283 | | | | // : が連続している場合は、 :: となる(構造体用)
284 | | | | ((TToken *)TokenList->Last())->Str += ":";
285 | | | | */
| | | +-+---+
286 | | | | } |
| | | +-+---+
| | | +-+-------+
286 | | | | else{ |
| | | +-+-------+
287 | | | +--- CurPos = Stream->Position;
288 | | | +--- TokenList->Add((void *)new TToken(c,-1));
| | | +-+---+
289 | | | | } |
| | | +-----+
| | +-+---+
290 | | | } |
| | +-----+
| +-+---+
291 | | } |
| +-----+
292 +--- delete Stream;
| +------------------------------------------------------------+
293 +--+ if(((TToken *)TokenList->Last())->TokId != tid_LineEnd ){ |
| +--+---------------------------------------------------------+
294 | +--- CurPos = Stream->Position;
295 | +--- TokenList->Add((void *)new TToken("\n",tid_LineEnd));
| +-+---+
296 | | } |
| +-----+
+-+---+
297 | } |
+-----+