Develop and Download Open Source Software

Browse Subversion Repository

Contents of /print.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Mon Nov 7 12:03:00 2011 UTC (12 years, 4 months ago) by shiraishikazuo
File MIME type: text/x-pascal
File size: 15518 byte(s)


1 unit print;
2 {$IFDEF FPC}
3 {$MODE DELPHI}{$H+}
4 {$ENDIF}
5 (***************************************)
6 (* Copyright (C) 2009, SHIRAISHI Kazuo *)
7 (***************************************)
8
9
10 interface
11 uses variabl,struct;
12
13 function MatPrintst(prev,eld:TStatement):TStatement;
14 function MatWritest(prev,eld:TStatement):TStatement;
15 function IfThereClause(prev:TStatement):TStatement;
16 function ImageRef:TPrincipal;
17
18 function ChannelCode(chn:TPrincipal):ansistring;
19
20 implementation
21
22 uses Dialogs,Controls, SysUtils,
23 listcoll,base,base0,texthand,textfile,express,control,io,helpctex,
24 optina,sconsts;
25
26 type
27 TAbstractPrintItem=Class(TStatement)
28 function nextitem:TAbstractPrintItem;virtual;abstract;
29 procedure execute(ch:TTextDevice);virtual;abstract;
30 end;
31
32 TPrint=class(TStatement)
33 chn: TPrincipal;
34 item:TAbstractPrintItem;
35 ifthere:TStatement;
36 RecordSetter:tpRecordSetter;
37 option:IOoptions;
38 constructor create(prev,eld:TStatement; mat:boolean; wri:boolean);
39 destructor destroy;override;
40 function Code:AnsiString;override;
41 end;
42
43
44 function IfThereClause(prev:TStatement):TStatement;
45 begin
46 result:=nil;
47 if (token='IF') and (nexttoken='THERE') then
48 begin
49 gettoken;
50 gettoken;
51 check('THEN',IDH_FILE);
52 if tokenspec=NRep then
53 begin
54 result:=GOTOst(prev,nil);
55 //result.eldest:=result
56 end
57 else
58 begin
59 check('EXIT',IDH_FILE);
60 result:=EXITst(prev,nil);
61 end;
62 end;
63 end;
64
65
66 type
67 TPrintItem=class(TAbstractPrintItem)
68 exp:TPrincipal;
69 direction:shortint; {-1:TAB, 0:no care, 1:new zone, 2:new line}
70 TAB:boolean;
71 constructor create1;
72 function nextitem:TAbstractPrintItem;override;
73 destructor destroy;override;
74 function Code:AnsiString;override;
75 end;
76
77 type
78 TPrintItemUsing = class(TAbstractPrintItem)
79 image:TPrincipal;
80 items:TListCollection;
81 direction:shortint; { 0:no care, 2:new line}
82 constructor create2(image1:TPrincipal);
83 function initsub(image1:TPrincipal; mat:boolean):boolean;
84 destructor destroy;override;
85 function Code:AnsiString;override;
86 end;
87
88 TMatPrintItemUsing=class(TPrintItemUsing)
89 constructor create2(image1:TPrincipal);
90 function Code:AnsiString;override;
91 end;
92
93
94 function separator(var fin:boolean):integer;
95 begin
96 fin:=false;
97 separator:=2;
98 if token=';' then
99 begin
100 separator:=0;
101 gettoken
102 end
103 else if token=',' then
104 begin
105 separator:=1;
106 gettoken
107 end
108 else
109 fin:=true ;
110 end;
111
112
113 constructor TPrintItem.create1;
114 var
115 fin:boolean;
116 begin
117 inherited create(nil,nil);
118 if (token='TAB') and (IdRecord(false)=nil)
119 then
120 begin
121 TAB:=true;
122 gettoken;
123 check('(',IDH_PRINT);
124 exp:=NExpression;
125 check(')',IDH_PRINT)
126 end
127 else
128 if (token=',') or (token=';') then
129 exp:=nil
130 else
131 begin
132 exp:=NSExpression;
133 end;
134 direction:=separator(fin);
135 if (not fin) and (tokenspec<>tail) and (token<>'ELSE') then
136 next:=NextItem;
137 end;
138
139 function TPrintItem.NextItem:TAbstractPrintItem;
140 begin
141 result:=TPrintItem.create1
142 end;
143
144
145
146 destructor TPrintItem.destroy;
147 begin
148 exp.free;
149 inherited destroy
150 end;
151
152
153
154 constructor TPrintItemUsing.create2(image1:TPrincipal);
155 begin
156 initsub(image1,false) ;
157
158 end;
159
160
161 function TPrintItemUsing.initsub(image1:TPrincipal; mat:boolean):boolean;
162 var
163 exp:TPrincipal;
164 begin
165 initsub:=false;
166 inherited create(nil,nil);
167 image:=image1;
168 items:=TListCollection.create;
169 repeat
170 if mat then
171 exp:=Matrix
172 else
173 exp:=NSExpression;
174 if exp=nil then exit;
175 items.insert(exp);
176 until test(',')=false;
177 if token=';' then
178 begin direction:=0; gettoken end
179 else
180 direction:=2;
181 initsub:=true;
182 end;
183
184 destructor TPrintItemUsing.destroy;
185 begin
186 items.free;
187 image.free;
188 inherited destroy;
189 end;
190
191
192 function ImageRef:TPrincipal;
193 var
194 long:longint;
195 index:integer;
196 begin
197 result:=nil;
198 if tokenspec=Nrep then {���������}
199 begin
200 if nonnegativeintegralnumber(long) and (long>0) then
201 if pass=2 then
202 with programUnit do
203 begin
204 index:=imagelist.indexofobject(TObject(long));
205 if index>=0 then
206 imageRef:=TStrConstant.create(ImageList.strings[index])
207 else
208 seterr(SysUtils.Format(s_LineNotFound,[strint(long)]),IDH_PRINT_USING);
209 end
210 else
211 else
212 seterrexpected(s_IllegalLineNumber,IDH_PRINT_USING);
213 end
214 else
215 imageRef:=SExpression;
216 end;
217
218
219
220 {*********}
221 {MAT PRINT}
222 {*********}
223
224
225 constructor TMatPrintItemUsing.create2(image1:TPrincipal);
226 begin
227 initsub(image1,true);
228 end;
229
230
231
232 {********}
233 { TPRINT }
234 {********}
235
236 destructor TPrint.destroy;
237 begin
238 item.free ;
239 chn.free;
240 inherited destroy;
241 end;
242
243
244
245 {**********}
246 { Mat Print}
247 {**********}
248
249 type
250 TMatPrintItem=class(TAbstractPrintItem)
251 mat1:TMatrix;
252 direction:integer;
253 constructor create1;
254 function nextitem:TAbstractPrintItem;override;
255 //procedure execute(ch:TTextDevice);override;
256 destructor destroy;override;
257 function code:ansistring;override;
258 end;
259
260 constructor TMatPrintItem.create1;
261 begin
262 inherited Create(nil,nil);
263 mat1:=matrix;
264 if test(';') then
265 direction:=0
266 else if test(',') then
267 direction:=1
268 else
269 direction :=2;
270 if (tokenspec<>tail) and (token<>'ELSE') then
271 next:=NextItem;
272 end;
273
274 function TMatPrintItem.NextItem:TAbstractPrintItem;
275 begin
276 result:=TMatPrintItem.create1
277 end;
278
279 destructor TMATPrintItem.destroy;
280 begin
281 mat1.free;
282 inherited destroy
283 end;
284
285
286 {***************}
287 {WRITE statement}
288 {***************}
289 type
290 TWriteItem=class(TPRINTItem)
291 constructor create1;
292 function nextitem:TAbstractPrintItem;override;
293 //procedure execute(ch:TTextDevice);override;
294
295 end;
296
297 constructor TWriteItem.create1;
298 begin
299 inherited create1;
300 if tab or (direction=0) then seterr(WriteSyntaxErrorMes,IDH_Write)
301 end;
302
303 function TWriteItem.NextItem:TAbstractPrintItem;
304 begin
305 result:=TWriteItem.create1
306 end;
307
308
309
310 type
311 TMatWriteItem=class(TMatPrintItem)
312 constructor create1;
313 function nextitem:TAbstractPrintItem;override;
314
315 end;
316
317 constructor TMatWriteItem.create1;
318 begin
319 inherited create1;
320 if direction=0 then seterr(WriteSyntaxErrorMes,IDH_Write)
321 end;
322
323 function TMatWriteItem.NextItem:TAbstractPrintItem;
324 begin
325 result:=TMatWriteItem.create1
326 end;
327
328
329
330 {**********}
331 {Statements}
332 {**********}
333
334
335 constructor TPrint.create(prev,eld:TStatement; mat:boolean; wri:boolean);
336 var
337 image:TPrincipal;
338 begin
339 inherited create(prev,eld);
340 if wri then option:=[ioReadWrite];
341 image:=nil;
342 textMode:=true;
343
344 if wri or (token='#') then
345 begin
346 chn:=ChannelExpression;
347 if chn=nil then
348 SetErrExpected('#',IDH_INTERNAL_FILE);
349 while token=',' do
350 begin
351 gettoken;
352 if (token='USING') and not wri then
353 begin
354 gettoken;
355 image:=imageRef
356 end
357 else if token='IF' then
358 IfThere:=IfThereClause(prev)
359 else
360 RecordSetterClause(RecordSetter);
361 end;
362 if prevtoken=',' then seterrIllegal(token,IDH_FILE_PRINT);
363 if not wri and not mat and ((tokenspec=tail) or (token='ELSE')) then exit;
364 if not wri and not mat and (token=':') and
365 ((Nexttokenspec=tail) or (NextToken='ELSE')) then
366 begin
367 ReplaceToken(' ');
368 Raise ERecompile.create('') ;
369 end;
370
371 checkToken(':',IDH_FILE_PRINT);
372 if wri then
373 if mat then
374 item:=TMatWriteItem.create1
375 else
376 item:=TWriteItem.create1
377 else if image<>nil then
378 if mat then
379 item:=TMatPrintItemUsing.create2(image)
380 else
381 item:=TPrintItemUsing.create2(image)
382 else
383 if mat then
384 item:=TMatPrintItem.create1
385 else
386 item:=TPrintItem.create1 ;
387
388 end
389 else if (token='USING')
390 and ((NextTokenSpec=NREP) or (NextTokenspecWithinParenthesis in [SCon,SIdf]))
391 then
392 begin
393 gettoken;
394 image:=ImageRef;
395 if not mat and ((tokenspec=tail) or (token='ELSE')) then exit;
396 if (token=';') then
397 if permitMicrosoft then
398 gettoken
399 else if (AutoCorrect[ac_using]
400 or confirm(s_ConfirmCorrectPRINT_USING,
401 IDH_microsoft_IO)) then
402 begin {MS-syntax}
403 replacetoken(':');
404 gettoken;
405 end
406 else
407 else
408 checkToken(':',IDH_PRINT_USING);
409
410 if mat then
411 item:=TMatPrintItemUsing.create2(image)
412 else
413 item:=TPrintItemUsing.create2(image);
414
415 end
416 else
417 begin
418 if not mat and ((tokenspec=tail) or (token='ELSE') or (token=':')) then exit;
419 if mat then
420 item:=TMatPrintItem.create1
421 else
422 item:=TPrintItem.create1;
423 end;
424
425 end;
426
427 function Printst(prev,eld:tStatement):TStatement;
428 begin
429 result:=TPrint.create(prev,eld,false,false);
430 end;
431
432 function MatPrintst(prev,eld:TStatement):TStatement;
433 begin
434 result:=TPrint.create(prev,eld,true,false)
435 end;
436
437
438 function WRITEst(prev,eld:TStatement):TStatement;
439 begin
440 result:=TPrint.create(prev,eld,false,true)
441 end;
442
443 function MatWritest(prev,eld:TStatement):TStatement;
444 begin
445 result:=TPrint.create(prev,eld,true,true)
446 end;
447
448 function PRINTQst(prev,eld:TStatement):TStatement;
449 begin
450 SelectPrevToken; {SelectLine(TextHand.memo,linenumber);}
451 if AutoCorrect[ac_using] or
452 ( MessageDlg(s_QuestionMark,mtConfirmation,
453 [mbYes,mbNo],IDH_MICROSOFT_IO)=mrYes) then
454 begin
455 replaceprevToken('PRINT ');
456 PRINTQst:=PRINTst(prev,eld)
457 end
458 else
459 seterrIllegal(prevToken,IDH_MICROSOFT_IO) ;
460 end;
461
462 {******}
463 {LPRINT}
464 {******}
465
466 type
467 TLPRINT=class(TPRINT)
468 //procedure exec;override;
469 end;
470 (*
471 procedure TLPrint.exec;
472 begin
473 IdleImmediately;
474
475 if item=nil then
476 LocalPrinter.newline
477 else
478 begin
479 try
480 item.execute(LocalPrinter);
481 LocalPrinter.flush
482 except
483 LocalPrinter.WBuffClear;
484 raise
485 end;
486 end
487
488 end;
489 *)
490
491
492 function LPRINTst(prev,eld:TStatement):TStatement;
493 begin
494 if permitMicrosoft then
495 result:=TLPRINT.create(prev,eld,false,false)
496 else
497 seterr(s_LPRINT,IDH_MICROSOFT_IO) ;
498 end;
499
500
501
502
503 {**************}
504 { Generate Code}
505 {**************}
506
507 function TPrintItem.Code:AnsiString;
508 begin
509 if TAB then
510 result:='TTAB.create('+exp.Code+')'
511 else if exp<>nil then
512 if (exp.kind='n') and (PUnit.Arithmetic=precisionComplex) then
513 result := 'TComplex.create('+exp.Code+')'
514 else
515 result := exp.Code
516 else
517 result:='''''';
518
519 case direction of
520 1: Result:= Result + ', TNewZone.create ' ;
521 2: Result:= Result + ', TNewLine.create ' ;
522 else
523 end;
524
525 if next <>nil then
526 result:=result+','+next.code;
527
528 end;
529
530
531 function ChannelCode(chn:TPrincipal):ansistring;
532 begin
533 if chn=nil then
534 ChannelCode:='console'
535 else
536 ChannelCode:='ChannelList.channel('+ chn.code + ')' ;
537 end;
538
539 function TPrint.Code:Ansistring;
540 begin
541
542
543 if item=nil then
544 result:=ChannelCode(chn)+'.PRINT(' + IOOptionsCode(option) +','
545 + RecordSetterCode[RecordSetter] +','
546 + TruthLiteral(insideofWhen)+','
547 +'[TNewLine.create]);'
548 else if item is TMatprintitemUsing then
549 result:=ChannelCode(chn)+'.MATPRINTUSING('+item.code+');'
550 else if item is TprintitemUsing then
551 result:=ChannelCode(chn)+'.PRINTUSING('+item.code+');'
552 else if item is TMatprintitem then
553 result:=ChannelCode(chn)+'.MATPRINT(' + IOOptionsCode(option) +','
554 + RecordSetterCode[RecordSetter] +','
555 + TruthLiteral(insideofWhen)+','
556 +'['+item.code+']);'
557 else if item is TPrintItem then
558 result:=ChannelCode(chn)+'.PRINT(' + IOOptionsCode(option) +','
559 + RecordSetterCode[RecordSetter] +','
560 + TruthLiteral(insideofWhen)+','
561 +'['+item.code+']);'
562 else
563 ;
564
565
566 if IfThere<>nil then
567 result := 'try' +EOL
568 + result
569 + 'except' + EOL
570 + ' on EExtype do if extype=7308 then'+EOL
571 + ' begin extype:=0; ' + IfThere.Code +' end' +EOL
572 + ' else raise;' +EOL
573 + 'end;'+EOL
574 end;
575
576
577 function TPrintItemUsing.Code:ansistring;
578 var
579 c:integer;
580 s:ansistring;
581 begin
582 result:=image.code +',[';
583 for c:=0 to items.count-1 do
584 begin
585 if c>0 then result:=result+',';
586 s:=TPrincipal(items.items[c]).code;
587 if (TPrincipal(items.items[c]).kind='n') and (PUnit.Arithmetic=precisionComplex) then
588 s:='testreal('+s+')';
589 result:=result+s;
590 end;
591 result:=result+'],'+ TruthLiteral(direction=2) + ','
592 + TruthLiteral(insideofWhen) ;
593
594
595 end;
596
597 function TmatPrintItem.code:ansistring;
598 begin
599 result:=mat1.code +',' + inttostr(direction);
600 if next<>nil then
601 result:=result+','+next.code
602 end;
603
604 function TMatPrintItemUsing.Code:ansistring;
605 var
606 c:integer;
607 begin
608 result:=image.code +',[';
609 for c:=0 to items.count-1 do
610 begin
611 if c>0 then result:=result+',';
612 result:=result+TPrincipal(items.items[c]).code;
613 end;
614 result:=result+'],'+ TruthLiteral(direction=2) + ','
615 + TruthLiteral(insideofWhen) ;
616
617
618 end;
619
620
621
622 procedure statementTableinit;far;
623 begin
624 statementTableinitImperative('PRINT',PRINTst);
625 statementTableinitImperative('WRITE',WRITEst);
626 statementTableinitImperative('?',PRINTQst);
627 //statementTableinitImperative('LPRINT',LPRINTst);
628 end;
629
630 begin
631 tableInitProcs.accept(statementTableinit);
632 end.
633

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26