Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/CellG.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (hide annotations) (download) (as text)
Mon Feb 23 07:50:11 2015 UTC (9 years, 1 month ago) by yamat0jp
File MIME type: text/x-pascal
File size: 29293 byte(s)


1 yamat0jp 2 unit CellG;
2    
3     interface
4    
5     uses
6     SysUtils;
7    
8     const
9     _aI = 1;
10     _aS = 2;
11     _Read = 3;
12     _Print = 4;
13     _Println = 5;
14     _If = 6;
15     _Else = 7;
16     _For = 8;
17     _While = 9;
18     _Do = 10;
19     _I = 11;
20     _S = 12;
21     _V = 13;
22     _Return = 14;
23     _Break = 15;
24     _ReadS = 16;
25     _end_KeyWd = 17;
26    
27     _Plus = 18;
28     _Plus2 = 19;
29     _Minus = 20;
30     _Minus2 = 21;
31     _Mult = 22;
32     _Div = 23;
33     _Equal = 24;
34     _Comma = 25;
35     _Semicolon = 26;
36     _Lparen = 27;
37     _Rparen = 28;
38     _Lbrace = 29;
39     _Rbrace = 30;
40     _Lbracket = 31;
41     _Rbracket = 32;
42     _Equal2 = 33;
43     _Lss = 34;
44     _Gtr = 35;
45     _LssEq = 36;
46     _GtrEq = 37;
47     _NotEq = 38;
48     _Ex = 39;
49     _DQ = 40;
50     _Period = 41;
51     _end_Sym = 42;
52    
53     intID = 41;
54     arrI = 42;
55     arrS = 43;
56     funID = 44;
57     parI = 45;
58     strID = 46;
59     parS = 47;
60    
61     Id = 51;
62     Num = 52;
63     Moji = 53;
64     nul = 54;
65     end_Token = 55;
66    
67     others = 61;
68     digit = 62;
69     letter = 63;
70     space = 64;
71     tab = 65;
72     cr1 = 66;
73     dollar = 67;
74     at = 68;
75    
76     MaxName = 20;
77     MaxTable = 200;
78     MaxModule = 50;
79     MaxLevel = 20;
80     firstAddr = 3;
81    
82     type
83     TcClass = record
84     small: Char;
85     big: Char;
86     result: integer;
87     end;
88    
89     TToken = class
90     public
91     kind: integer;
92     id: string;
93     value: integer;
94     end;
95    
96     TRaddr = record
97     level: integer;
98     addr: integer;
99     end;
100    
101     TModule = class
102     public
103     name: string;
104     index: integer;
105     number: integer;
106     constructor Create(n: string; i, s: integer); overload;
107     constructor Create(n: string); overload;
108     end;
109    
110     TTable = class
111     public
112     name: string;
113     kind: integer;
114     Raddr: TRaddr;
115     constructor Create(const id: string; const k, l, a: integer); overload;
116     constructor Create(const id: string); overload;
117     function toString: string; virtual;
118     end;
119    
120     TTableArray = class(TTable)
121     public
122     jigen: integer;
123     gyou: integer;
124     retu: integer;
125     constructor Create(const id: string; const k, l, a, j, g, r: integer);
126     function toString: string; override;
127     end;
128    
129     TTableFunc = class(TTable)
130     public
131     modori: integer;
132     parIs: integer;
133     parSs: integer;
134     constructor Create(const id: string; const k, l, a, m, pi, ps: integer);
135     function toString: string; override;
136     end;
137    
138     TKari = class
139     public
140     name: string;
141     md: string;
142     sahen: integer;
143     tI: integer;
144     lcI: integer;
145     scI: integer;
146     pI: integer;
147     pS: integer;
148     cI: integer;
149     tf: Boolean;
150     constructor Create(n, m: string; s, t, lc, sc, pi, ps, c: integer; f: Boolean);
151     end;
152    
153     TCellG = class
154     private
155     nameTable: array [0..MaxTable] of TTable;
156     funcTable: array [0..MaxTable div 2] of TTable;
157     moduleTable: array [0..MaxModule] of TModule;
158     kariTable: array [0..MaxTable div 4] of TKari;
159     tIndex: integer;
160     fIndex: integer;
161     tfIndex: integer;
162     mIndex: integer;
163     kIndex: integer;
164     kan: integer;
165     localAddr: integer;
166     slocalAddr: integer;
167     level: integer;
168     index: array [0..MaxLevel] of integer;
169     addr: array [0..MaxLevel] of integer;
170     saddr: array [0..MaxLevel] of integer;
171     BufferedReader: TextFile;
172     c: Char;
173     line: string;
174     lineIndex: integer;
175     errorLine: string;
176     cr: integer;
177     lastT: TToken;
178     mojiretu: string;
179     key: array [0.._end_Sym] of string;
180     public
181     pTable: Boolean;
182     e: integer;
183     exe: integer;
184     constructor Create(p: Boolean);
185     destructor Destroy; override;
186     function open(const f: TFileName; cellV: TObject): Boolean;
187     procedure closeFile;
188     procedure blockBegin;
189     procedure blockEnd;
190     procedure setTable(t: TTable);
191     procedure setModule(id: string);
192     procedure setKariTable(id, m: string; s, ti, lc, pi, ps, c: integer);
193     procedure setScI(c: integer);
194     function moduleName: string;
195     function tableInt(const id: string): integer;
196     procedure initKey;
197     procedure setFunc(t: TTable);
198     function tablePstr(id: string): integer;
199     function tableString(id: string): integer;
200     function tableA1int(const id: string; const n: integer): integer;
201     function tableA2int(const id: string; const x, v: integer): integer;
202     function tableA1str(id: string; n: integer): integer;
203     function tableA2str(id: string; x, v: integer): integer;
204     function tableFunc(const id: string; const c, mm: integer): integer;
205     function tablePint(const id: string): integer;
206     procedure endPar;
207     procedure changeT(t, k: integer; x: Boolean);
208     function searchT(const id: string): integer;
209     function searchF(const id: string; m: integer): integer;
210     function searchFModule(m, id: string): integer;
211     procedure checkKari(id: string);
212     procedure checkKan;
213     function tAddr(const n: integer): TRaddr;
214     function bLevel: integer;
215     function funcParIs: integer;
216     function funcParSs: integer;
217     function fModori(n: integer): integer;
218     function funcModori: integer;
219     function pKazuI(const n: integer): integer;
220     function pKazuS(n: integer): integer;
221     function tKind(const n: integer): integer;
222     function hairetu(const n: integer): TRaddr;
223     function numAddr: integer;
224     function snumAddr: integer;
225     function nextTIndex: integer;
226     function checkGet(t: TToken; const k: integer): TToken;
227     function jigen(const i: integer): integer;
228     function checkIn(const n: string): Boolean;
229     procedure error(const er: string);
230     procedure shokika;
231     function nextChar: Char;
232     function makeToken: TToken;
233     function cClass(c: Char): integer;
234     end;
235    
236     function hyouji(const k: integer): string;
237    
238     const
239     fClass: array [0..25] of TcClass = ((small: #$09; big: #$09; result: tab),(small: #13; big: #13; result: cr1),
240     (small: ' '; big: ' '; result: space),(small: '!'; big: '!'; result: _Ex),(small: '"'; big: '"'; result: _DQ),
241     (small: '$'; big: '$'; result: dollar),(small: '('; big: '('; result: _Lparen),(small: ')'; big: ')'; result: _Rparen),
242     (small: '*'; big: '*'; result: _Mult),(small: '+'; big: '+'; result: _Plus),(small: ','; big: ','; result: _Comma),
243     (small: '-'; big: '-'; result: _Minus),(small: '.'; big: '.'; result: _Period),(small: '/'; big: '/'; result: _Div),
244     (small: '0'; big: '9'; result: digit),(small: ';'; big: ';'; result: _Semicolon),(small: '<'; big: '<'; result: _Lss),
245     (small: '='; big: '='; result: _Equal),(small: '>'; big: '>'; result: _Gtr),(small: '@'; big: '@'; result: at),
246     (small: 'A'; big: 'Z'; result: letter),(small: '['; big: '['; result: _Lbracket),(small: ']'; big: ']'; result: _Rbracket),
247     (small: 'a'; big: 'z'; result: letter),(small: '{'; big: '{'; result: _Lbrace),(small: '}'; big: '}'; result: _Rbrace));
248    
249     implementation
250    
251     uses CellV;
252    
253     const
254     MaxMoji = 200;
255    
256     var
257     _cellV: TCellV;
258    
259     function hyouji(const k: integer): string;
260     begin
261     case k of
262     intID:
263     result:='intID';
264     strID:
265     result:='strID';
266     arrI:
267     result:='arrI';
268     funID:
269     result:='funID';
270     parI:
271     result:='parI';
272     parS:
273     result:='parS';
274     _I:
275     result:='I';
276     _S:
277     result:='S';
278     _V:
279     result:='V';
280     else
281     result:=IntToStr(k);
282     end;
283     end;
284    
285     { TTable }
286    
287     constructor TTable.Create(const id: string; const k, l, a: integer);
288     begin
289     inherited Create;
290     name:=id;
291     kind:=k;
292     raddr.level:=l;
293     raddr.addr:=a;
294     end;
295    
296     constructor TTable.Create(const id: string);
297     begin
298     inherited Create;
299     name:=id;
300     end;
301    
302     function TTable.toString: string;
303     begin
304     result:=name+' : '+hyouji(kind)+' : '+IntToStr(raddr.level)+IntToStr(raddr.addr);
305     end;
306    
307     { TTableArray }
308    
309     constructor TTableArray.Create(const id: string; const k, l, a, j, g,
310     r: integer);
311     begin
312     inherited Create(id,k,l,a);
313     jigen:=j;
314     gyou:=g;
315     retu:=r;
316     end;
317    
318     function TTableArray.toString: string;
319     begin
320     result:=inherited toString+' : '+IntToStr(jigen)+'����: '+IntToStr(gyou)+
321     IntToStr(retu)+'��';
322     end;
323    
324     { TCellG }
325    
326     function TCellG.bLevel: integer;
327     begin
328     result:=level;
329     end;
330    
331     procedure TCellG.blockBegin;
332     begin
333     if level = -1 then
334     begin
335     localAddr:=firstAddr;
336     slocalAddr:=0;
337     tIndex:=0;
338     inc(level);
339     end else
340     if level = MaxLevel-1 then
341     begin
342     error('�u���b�N���[��������');
343     end else
344     begin
345     index[level]:=tIndex;
346     addr[level]:=localAddr;
347     saddr[level]:=slocalAddr;
348     localAddr:=firstAddr;
349     slocalAddr:=0;
350     inc(level);
351     end;
352     end;
353    
354     procedure TCellG.blockEnd;
355     var
356     i, j: integer;
357     begin
358     if pTable = true then
359     begin
360     Writeln('--level : '+IntToStr(level)+'--');
361     if level = 0 then
362     begin
363     i:=1;
364     end else
365     begin
366     i:=index[level-1]+1;
367     end;
368     for j:=i to tIndex do
369     begin
370     Writeln(nameTable[j].toString);
371     end;
372     for j:=tfIndex to fIndex do
373     begin
374     if fIndex = 0 then
375     begin
376     break;
377     end;
378     Writeln(funcTable[j].toString);
379     end;
380     Writeln;
381     end;
382     if level = 0 then
383     begin
384     dec(level);
385     end else
386     begin
387     dec(level);
388     for i:=index[level]+1 to tIndex do
389     begin
390     nameTable[i].Free;
391     end;
392     tIndex:=index[level];
393     localAddr:=addr[level];
394     slocalAddr:=saddr[level];
395     end;
396     end;
397    
398     function TCellG.checkGet(t: TToken; const k: integer): TToken;
399     begin
400     if t.kind <> k then
401     begin
402     error('��������������-'+key[k]);
403     result:=t;
404     end else
405     begin
406     result:=makeToken;
407     end;
408     end;
409    
410     function TCellG.checkIn(const n: string): Boolean;
411     var
412     i, j: integer;
413     begin
414     if Length(n) = 0 then
415     begin
416     result:=true;
417     end else
418     begin
419     result:=false;
420     for i:=1 to Length(n) do
421     begin
422     j:=cClass(n[i]);
423     if j <> digit then
424     begin
425     result:=true;
426     break;
427     end;
428     end;
429     end;
430     end;
431    
432     procedure TCellG.closeFile;
433     begin
434     try
435     System.CloseFile(BufferedReader);
436     except
437     on EInOutError do Writeln('�t�@�C������������������');
438     end;
439     end;
440    
441     constructor TCellG.Create(p: Boolean);
442     begin
443     inherited Create;
444     pTable:=p;
445     lastT:=TToken.Create;
446     initKey;
447     shokika;
448     end;
449    
450     destructor TCellG.Destroy;
451     begin
452     lastT.Free;
453     nameTable[0].Free;
454     moduleTable[0].Free;
455     inherited;
456     end;
457    
458     procedure TCellG.endPar;
459     var
460     i, pI, pS: integer;
461     begin
462     with funcTable[tfIndex] as TTableFunc do
463     begin
464     pI:=parIs;
465     pS:=parSs;
466     end;
467     if (pI = 0)and(pS = 0) then
468     begin
469     Exit;
470     end;
471     for i:=tfIndex+1 to tfIndex+pI+pS do
472     begin
473     if funcTable[i].kind = parI then
474     begin
475     funcTable[i].Raddr.addr:=-pI;
476     dec(pI);
477     end else
478     begin
479     funcTable[i].Raddr.addr:=-pS;
480     dec(pS);
481     end;
482     end;
483     end;
484    
485     procedure TCellG.error(const er: string);
486     begin
487     inc(e);
488     Writeln(IntToStr(cr)+' : '+errorLine+' : '+er+'�B');
489     errorLine:='';
490     end;
491    
492     function TCellG.fModori(n: integer): integer;
493     begin
494     result:=(funcTable[n-tIndex] as TTableFunc).modori;
495     end;
496    
497     function TCellG.funcParIs: integer;
498     begin
499     result:=(funcTable[tfIndex] as TTableFunc).parIs;
500     end;
501    
502     function TCellG.hairetu(const n: integer): TRaddr;
503     begin
504     with nameTable[n] as TTableArray do
505     begin
506     result.level:=gyou;
507     result.addr:=retu;
508     end;
509     end;
510    
511     procedure TCellG.initKey;
512     begin
513     key[_aI]:='aI';
514     key[_Print]:='print';
515     key[_Println]:='println';
516     key[_Read]:='read';
517     key[_ReadS]:='reads';
518     key[_If]:='if';
519     key[_Else]:='else';
520     key[_For]:='for';
521     key[_While]:='while';
522     key[_Do]:='do';
523     key[_I]:='i';
524     key[_S]:='s';
525     key[_V]:='v';
526     key[_Return]:='return';
527     key[_Break]:='break';
528     key[_end_KeyWd]:='dummy1';
529     key[_Plus]:='+';
530     key[_Minus]:='-';
531     key[_Mult]:='*';
532     key[_Equal]:='=';
533     key[_Comma]:=',';
534     key[_Semicolon]:=':';
535     key[_Lparen]:='(';
536     key[_Rparen]:=')';
537     key[_Lbrace]:='{';
538     key[_Rbrace]:='}';
539     key[_LBracket]:='[';
540     key[_Rbracket]:=']';
541     key[_Lss]:='<';
542     key[_Gtr]:='>';
543     key[_LssEq]:='<=';
544     key[_GtrEq]:='>=';
545     key[_NotEq]:='!=';
546     key[_Ex]:='!';
547     key[_end_Sym]:='dummy2';
548     end;
549    
550     function TCellG.jigen(const i: integer): integer;
551     begin
552     result:=TTableArray(nameTable[i]).jigen;
553     end;
554    
555     function TCellG.makeToken: TToken;
556     var
557     i: integer;
558     cc, k: integer;
559     num: integer;
560     temp: TToken;
561     id: string;
562     begin
563     temp:=TToken.Create;
564     while true do
565     begin
566     k:=lastT.kind;
567     if k <> nul then
568     begin
569     if k < _end_Sym then
570     begin
571     errorLine:=errorLine+key[lastT.kind];
572     end else
573     if k = CellG.Num then
574     begin
575     errorLine:=errorLine+IntToStr(lastT.value);
576     end else
577     if k = CellG.Id then
578     begin
579     errorLine:=errorLine+lastT.id;
580     end;
581     end;
582     cc:=cClass(c);
583     while (cc = space)or(cc = cr1)or(cc = tab) do
584     begin
585     if (cc = space)or(cc = tab) then
586     begin
587     errorLine:=errorLine+c;
588     end;
589     if cc = cr1 then
590     begin
591     inc(cr);
592     errorLine:='';
593     end;
594     c:=nextChar;
595     cc:=cClass(c);
596     end;
597     case cc of
598     digit:
599     begin
600     num:=0;
601     while cc = digit do
602     begin
603     num:=10*num+StrToInt(c);
604     c:=nextChar;
605     cc:=cClass(c);
606     end;
607     temp.kind:=CellG.Num;
608     temp.value:=num;
609     break;
610     end;
611     letter,others:
612     begin
613     id:='';
614     while (cc = letter)or(cc = digit)or(cc = others) do
615     begin
616     if Length(id) < MaxName then
617     begin
618     id:=id+c;
619     end;
620     c:=nextChar;
621     cc:=cClass(c);
622     end;
623     if Length(id) >= MaxName then
624     begin
625     error('���O������������');
626     end;
627     for i:=0 to _end_KeyWd do
628     begin
629     if CompareText(id,key[i]) = 0 then
630     begin
631     temp.kind:=i;
632     temp.id:=id;
633     lastT.Free;
634     lastT:=temp;
635     result:=temp;
636     Exit;
637     end;
638     end;
639     temp.kind:=CellG.Id;
640     temp.id:=id;
641     break;
642     end;
643     _Equal:
644     begin
645     c:=nextChar;
646     if c = '=' then
647     begin
648     temp.kind:=_Equal2;
649     c:=nextChar;
650     end else
651     begin
652     temp.kind:=_Equal;
653     end;
654     break;
655     end;
656     _Ex:
657     begin
658     c:=nextChar;
659     if c = '=' then
660     begin
661     temp.kind:=_NotEq;
662     c:=nextChar;
663     end else
664     begin
665     temp.kind:=_Ex;
666     end;
667     break;
668     end;
669     _Lss:
670     begin
671     c:=nextChar;
672     if c = '=' then
673     begin
674     temp.kind:=_LssEq;
675     c:=nextChar;
676     end else
677     begin
678     temp.kind:=_Lss;
679     end;
680     break;
681     end;
682     _Gtr:
683     begin
684     c:=nextChar;
685     if c = '=' then
686     begin
687     temp.kind:=_GtrEq;
688     c:=nextChar;
689     end else
690     begin
691     temp.kind:=_Gtr;
692     end;
693     break;
694     end;
695     _Plus:
696     begin
697     c:=nextChar;
698     if c = '+' then
699     begin
700     temp.kind:=_Plus2;
701     c:=nextChar;
702     end else
703     begin
704     temp.kind:=_Plus;
705     end;
706     break;
707     end;
708     _Minus:
709     begin
710     c:=nextChar;
711     if c = '-' then
712     begin
713     temp.kind:=_Minus2;
714     c:=nextChar;
715     end else
716     begin
717     temp.kind:=_Minus;
718     end;
719     break;
720     end;
721     at:
722     begin
723     c:=nextChar;
724     cc:=cClass(c);
725     while cc <> at do
726     begin
727     errorLine:=errorLine+c;
728     c:=nextChar;
729     cc:=cClass(c);
730     end;
731     c:=nextChar;
732     continue;
733     end;
734     _DQ:
735     begin
736     i:=1;
737     mojiretu:='';
738     repeat
739     if i < MaxMoji then
740     begin
741     mojiretu:=mojiretu+c;
742     end;
743     inc(i);
744     c:=nextChar;
745     cc:=cClass(c);
746     until (cc = _DQ)or(cc = _Rbrace)or(cc = _Semicolon);
747     if (cc = _Rbrace)or(cc = _Semicolon) then
748     begin
749     error('"�������������B');
750     temp.kind:=cc;
751     lastT:=temp;
752     result:=temp;
753     Exit;
754     end;
755     if i >= MAXMOJI then
756     begin
757     error('����������������');
758     i:=MaxName-1;
759     end;
760     mojiretu:=mojiretu+'"';
761     temp.kind:=Moji;
762     temp.id:=Copy(mojiretu,2,i-2);
763     c:=nextChar;
764     break;
765     end;
766     dollar:
767     begin
768     checkKan;
769     temp.kind:=dollar;
770     break;
771     end;
772     else
773     temp.kind:=cc;
774     c:=nextChar;
775     break;
776     end;
777     end;
778     lastT.Free;
779     lastT:=temp;
780     result:=temp;
781     end;
782    
783     function TCellG.nextChar: Char;
784     begin
785     if lineIndex > Length(line) then
786     begin
787     if Eof(BufferedReader) = true then
788     begin
789     Writeln(IntToStr(cr)+':�t�@�C���I���A$�������������B'+IntToStr(e),'�G���[����:'+IntToStr(e+1));
790     System.CloseFile(BufferedReader);
791     raise EInOutError.Create('error');
792     end;
793     lineIndex:=1;
794     try
795     Readln(BufferedReader,line);
796     except
797     Writeln(IntToStr(cr)+'�����s�����������������B'+' : '+IntToStr(e),
798     '�G���[����:'+IntToStr(e+1));
799     raise;
800     end;
801     result:=#13;
802     end else
803     begin
804     result:=line[lineIndex];
805     inc(lineIndex);
806     end;
807     end;
808    
809     function TCellG.numAddr: integer;
810     begin
811     result:=localAddr;
812     end;
813    
814     function TCellG.snumAddr: integer;
815     begin
816     result:=slocalAddr;
817     end;
818    
819     function TCellG.open(const f: TFileName; cellV: TObject): Boolean;
820     begin
821     _cellV:=cellV as TCellV;
822     if FileExists(f) = false then
823     begin
824     result:=false;
825     Exit;
826     end;
827     try
828     AssignFile(BufferedReader,f);
829     Reset(BufferedReader);
830     Readln(BufferedReader,line);
831     lineIndex:=1;
832     c:=nextChar;
833     lastT.kind:=nul;
834     result:=true;
835     except
836     on EInOutError do
837     begin
838     Writeln('�t�@�C�����J��������');
839     result:=false;
840     end;
841     end;
842     end;
843    
844     function TCellG.pKazuI(const n: integer): integer;
845     begin
846     result:=(funcTable[n-tIndex] as TTableFunc).parIs;
847     end;
848    
849     function TCellG.searchF(const id: string; m: integer): integer;
850     var
851     i, j: integer;
852     begin
853     i:=moduleTable[m].index;
854     result:=0;
855     for j:=0 to moduleTable[m].number-1 do
856     begin
857     if funcTable[i+j].name = id then
858     begin
859     result:=i+j+tIndex;
860     end;
861     end;
862     end;
863    
864     function TCellG.searchT(const id: string): integer;
865     var
866     i: integer;
867     begin
868     result:=0;
869     nameTable[0].name:=id;
870     for i:=tIndex downto 0 do
871     begin
872     if id = nameTable[i].name then
873     begin
874     result:=i;
875     break;
876     end;
877     end;
878     if result = 0 then
879     begin
880     result:=searchF(id,mIndex);
881     end;
882     end;
883    
884     procedure TCellG.setFunc(t: TTable);
885     begin
886     if fIndex < (MaxTable div 2) then
887     begin
888     inc(fIndex);
889     funcTable[fIndex]:=t;
890     inc(moduleTable[mIndex].number);
891     end else
892     begin
893     error('����������������');
894     end;
895     end;
896    
897     procedure TCellG.setModule(id: string);
898     begin
899     inc(mIndex);
900     if mIndex < MaxModule then
901     begin
902     moduleTable[mIndex]:=TModule.Create(id,fIndex+1,0);
903     end else
904     begin
905     error('���W���[��������������');
906     end;
907     end;
908    
909     procedure TCellG.setTable(t: TTable);
910     begin
911     if tIndex < MaxTable then
912     begin
913     inc(tIndex);
914     nameTable[tIndex]:=t;
915     end else
916     begin
917     error('����������������');
918     end;
919     end;
920    
921     function TCellG.tableA1int(const id: string; const n: integer): integer;
922     begin
923     setTable(TTableArray.Create(id,arrI,level,localAddr,1,0,n));
924     inc(localAddr,n);
925     result:=tIndex;
926     end;
927    
928     function TCellG.tableA2int(const id: string; const x, v: integer): integer;
929     begin
930     setTable(TTableArray.Create(id,arrI,level,localAddr,2,x,v));
931     inc(localAddr,x*v);
932     result:=tIndex;
933     end;
934    
935     function TCellG.tableFunc(const id: string; const c, mm: integer): integer;
936     begin
937     setFunc(TTableFunc.Create(id,funID,level,c,mm,0,0));
938     tfIndex:=fIndex;
939     result:=fIndex+tIndex;
940     end;
941    
942     function TCellG.tableInt(const id: string): integer;
943     begin
944     setTable(TTable.Create(id,intID,level,localAddr));
945     inc(localAddr);
946     result:=tIndex;
947     end;
948    
949     function TCellG.tableString(id: string): integer;
950     begin
951     setTable(TTable.Create(id,strID,level,slocalAddr));
952     inc(slocalAddr);
953     result:=tIndex;
954     end;
955    
956     function TCellG.tablePint(const id: string): integer;
957     begin
958     setFunc(TTable.Create(id,parI,level,0));
959     inc((funcTable[tfIndex] as TTableFunc).parIs);
960     result:=fIndex+tIndex;
961     end;
962    
963     function TCellG.tablePstr(id: string): integer;
964     begin
965     setFunc(TTable.Create(id,parS,level,0));
966     inc((FuncTable[tfIndex] as TTableFunc).parSs);
967     result:=fIndex+tIndex;
968     end;
969    
970     function TCellG.tAddr(const n: integer): TRaddr;
971     begin
972     if n > tIndex then
973     begin
974     result:=funcTable[n-tIndex].Raddr;
975     end else
976     begin
977     result:=nameTable[n].Raddr;
978     end;
979     end;
980    
981     function TCellG.tKind(const n: integer): integer;
982     begin
983     if n = 0 then
984     begin
985     result:=0;
986     end else
987     if n > tIndex then
988     begin
989     result:=funcTable[n-tIndex].kind;
990     end else
991     begin
992     result:=nameTable[n].kind;
993     end;
994     end;
995    
996     function TCellG.cClass(c: Char): integer;
997     var
998     small, big, m: integer;
999     begin
1000     result:=others;
1001     small:=0;
1002     big:=High(fClass);
1003     while small <= big do
1004     begin
1005     m:=(small+big) div 2;
1006     if c < fClass[m].small then
1007     begin
1008     big:=m-1;
1009     end else
1010     if c > fClass[m].big then
1011     begin
1012     small:=m+1;
1013     end else
1014     begin
1015     result:=fClass[m].result;
1016     break;
1017     end;
1018     end;
1019     end;
1020    
1021     procedure TCellG.changeT(t, k: integer; x: Boolean);
1022     var
1023     i: integer;
1024     s: TTable;
1025     begin
1026     s:=nameTable[t];
1027     if s.kind = k then
1028     begin
1029     Exit;
1030     end;
1031     s.kind:=k;
1032     if x = true then
1033     begin
1034     i:=level-1;
1035     end else
1036     begin
1037     i:=level;
1038     end;
1039     if k = intID then
1040     begin
1041     if i = s.Raddr.level then
1042     begin
1043     s.Raddr.addr:=localAddr;
1044     inc(localAddr);
1045     dec(slocalAddr);
1046     end else
1047     begin
1048     s.Raddr.level:=addr[s.Raddr.level];
1049     inc(addr[s.Raddr.level]);
1050     dec(saddr[s.Raddr.level]);
1051     end;
1052     end else
1053     if k = strID then
1054     begin
1055     if i = s.Raddr.level then
1056     begin
1057     s.Raddr.addr:=slocalAddr;
1058     inc(slocalAddr);
1059     dec(localAddr);
1060     end else
1061     begin
1062     s.Raddr.level:=saddr[s.Raddr.level];
1063     inc(saddr[s.Raddr.level]);
1064     dec(addr[s.Raddr.level]);
1065     end;
1066     end;
1067     end;
1068    
1069     function TCellG.moduleName: string;
1070     begin
1071     result:=moduleTable[mIndex].name;
1072     end;
1073    
1074     function TCellG.nextTIndex: integer;
1075     begin
1076     result:=tIndex+1;
1077     end;
1078    
1079     function TCellG.searchFModule(m, id: string): integer;
1080     var
1081     i: integer;
1082     begin
1083     result:=-1;
1084     moduleTable[0].name:=m;
1085     for i:=mIndex downto 0 do
1086     begin
1087     if m = moduleTable[i].name then
1088     begin
1089     result:=i;
1090     end;
1091     end;
1092     if result >= 0 then
1093     begin
1094     result:=searchF(id,result);
1095     end;
1096     end;
1097    
1098     function TCellG.pKazuS(n: integer): integer;
1099     begin
1100     result:=(funcTable[n-tIndex] as TTableFunc).parSs;
1101     end;
1102    
1103     function TCellG.funcModori: integer;
1104     begin
1105     result:=(funcTable[tfIndex] as TTableFunc).modori;
1106     end;
1107    
1108     procedure TCellG.setKariTable(id, m: string; s, ti, lc, pi, ps, c: integer);
1109     begin
1110     if kIndex < (MaxTable div 4) then
1111     begin
1112     inc(kIndex);
1113     kariTable[kIndex]:=TKari.Create(id,m,s,ti,lc,0,pi,ps,c,false);
1114     end else
1115     begin
1116     error('�������������`������������');
1117     end;
1118     end;
1119    
1120     procedure TCellG.shokika;
1121     var
1122     i: integer;
1123     begin
1124     for i:=0 to tIndex do
1125     begin
1126     nameTable[i].Free;
1127     end;
1128     for i:=0 to fIndex do
1129     begin
1130     funcTable[i].Free;
1131     end;
1132     for i:=0 to kIndex do
1133     begin
1134     kariTable[i].Free;
1135     end;
1136     for i:=0 to mIndex do
1137     begin
1138     moduleTable[i].Free;
1139     end;
1140     kan:=-1;
1141     tIndex:=0;
1142     tfIndex:=0;
1143    
1144     localAddr:=0;
1145     slocalAddr:=0;
1146     e:=0;
1147     errorline:='';
1148    
1149     level:=-1;
1150     kIndex:=-1;
1151     fIndex:=0;
1152     mIndex:=-1;
1153     cr:=1;
1154     nameTable[0]:=TTable.Create;
1155     moduleTable[0]:=TModule.Create;
1156     end;
1157    
1158     procedure TCellG.checkKari(id: string);
1159     var
1160     i: integer;
1161     s: string;
1162     procedure main;
1163     var
1164     j: integer;
1165     begin
1166     j:=(funcTable[tfIndex] as TTableFunc).modori;
1167     if j = _V then
1168     begin
1169     if kariTable[i].sahen <> 0 then
1170     begin
1171     error('�����o�������������������������������B');
1172     end;
1173     end else
1174     if j = _I then
1175     begin
1176     case kariTable[i].sahen of
1177     strID:
1178     begin
1179     changeT(kariTable[i].tI,intID,true);
1180     _cellV.backPatchL(kariTable[i].lcI,kariTable[i].tI,0);
1181     _cellV.changeS(kariTable[i].scI,0);
1182     end;
1183     parS:
1184     error('�����o�������^�����v���������B');
1185     end;
1186     end else
1187     if j = _S then
1188     begin
1189     case kariTable[i].sahen of
1190     intID:
1191     begin
1192     changeT(kariTable[i].tI,strID,true);
1193     _cellV.backPatchL(kariTable[i].lcI,kariTable[i].tI,1);
1194     _cellV.changeS(kariTable[i].scI,1);
1195     end;
1196     arrI,parI:
1197     error('�����o�������^�����v���������B');
1198     end;
1199     end;
1200     if (funcTable[tfIndex] as TTableFunc).parIs <> kariTable[i].pI then
1201     begin
1202     error('�����o����������(I)�����������������B');
1203     end;
1204     if (funcTable[tfIndex] as TTableFunc).parSs <> kariTable[i].pS then
1205     begin
1206     error('�����o����������(S)�����������������B');
1207     end;
1208     _cellV.backCal(kariTable[i].cI,level-1,funcTable[tfIndex].Raddr.addr);
1209     kariTable[i].tf:=true;
1210     inc(kan);
1211     end;
1212     begin
1213     if kIndex = -1 then
1214     begin
1215     Exit;
1216     end;
1217     s:=moduleTable[mIndex].name;
1218     for i:=kIndex downto 0 do
1219     begin
1220     if kariTable[i].tf = false then
1221     begin
1222    
1223     if (id = kariTable[i].name)and(s = kariTable[i].md) then
1224     begin
1225     main;
1226     end;
1227    
1228     end;
1229     end;
1230     end;
1231    
1232     function TCellG.funcParSs: integer;
1233     begin
1234     result:=(funcTable[tfIndex] as TTableFunc).parSs;
1235     end;
1236    
1237     procedure TCellG.checkKan;
1238     begin
1239     if Kan < kIndex then
1240     begin
1241     error('���`��������������������������');
1242     end;
1243     end;
1244    
1245     procedure TCellG.setScI(c: integer);
1246     begin
1247     if kIndex > -1 then
1248     begin
1249     kariTable[kIndex].scI:=c;
1250     end;
1251     end;
1252    
1253     function TCellG.tableA1str(id: string; n: integer): integer;
1254     begin
1255     setTable(TTableArray.Create(id,arrS,level,slocalAddr,1,0,n));
1256     inc(slocalAddr,n);
1257     result:=tIndex;
1258     end;
1259    
1260     function TCellG.tableA2str(id: string; x, v: integer): integer;
1261     begin
1262     setTable(TTableArray.Create(id,arrS,level,slocalAddr,2,x,v));
1263     inc(slocalAddr,x*v);
1264     result:=tIndex;
1265     end;
1266    
1267     { TTableFunc }
1268    
1269     constructor TTableFunc.Create(const id: string; const k, l, a, m,
1270     pi, ps: integer);
1271     begin
1272     inherited Create(id,k,l,a);
1273     modori:=m;
1274     parIs:=pi;
1275     parIs:=ps;
1276     end;
1277    
1278     function TTableFunc.toString: string;
1279     begin
1280     result:=(inherited toString)+' : '+hyouji(modori)+' : '+IntToStr(parIs)+'pI'+
1281     ' : '+IntToStr(parSs)+'pS';
1282     end;
1283    
1284     { TModule }
1285    
1286     constructor TModule.Create(n: string; i, s: integer);
1287     begin
1288     inherited Create;
1289     name:=n;
1290     index:=i;
1291     number:=s;
1292     end;
1293    
1294     constructor TModule.Create(n: string);
1295     begin
1296     inherited Create;
1297     name:=n;
1298     end;
1299    
1300     { TKari }
1301    
1302     constructor TKari.Create(n, m: string; s, t, lc, sc, pi, ps, c: integer;
1303     f: Boolean);
1304     begin
1305     inherited Create;
1306     name:=n;
1307     md:=m;
1308     sahen:=s;
1309     tI:=t;
1310     lcI:=lc;
1311     scI:=sc;
1312     self.pI:=pi;
1313     self.pS:=ps;
1314     cI:=c;
1315     tf:=f;
1316     end;
1317    
1318     end.

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