From bce905b1060f0adeba567ed8649eef8eb3d0fc13 Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 30 Oct 2006 23:28:06 +0000 Subject: [PATCH] * give correct error locations for errors when specializing templates * removed more germanisms * better dumping of tokenbuf in ppudump git-svn-id: trunk@5101 - --- compiler/globals.pas | 2 +- compiler/parser.pas | 4 +-- compiler/pbase.pas | 4 +-- compiler/pdecl.pas | 36 ++++++++++++------------- compiler/pdecsub.pas | 44 +++++++++++++++--------------- compiler/pexpr.pas | 12 ++++----- compiler/pinline.pas | 8 +++--- compiler/pstatmnt.pas | 6 ++--- compiler/psub.pas | 2 +- compiler/ptype.pas | 10 +++---- compiler/scanner.pas | 56 ++++++++++++++++++++++++++++++--------- compiler/symdef.pas | 10 +++---- compiler/symtable.pas | 2 +- compiler/symtype.pas | 4 +-- compiler/utils/ppudump.pp | 38 +++++++++++++++++++++++--- 15 files changed, 149 insertions(+), 89 deletions(-) diff --git a/compiler/globals.pas b/compiler/globals.pas index 0eaaec8301..9bf3447372 100644 --- a/compiler/globals.pas +++ b/compiler/globals.pas @@ -218,7 +218,7 @@ interface RelocSectionSetExplicitly : boolean; LinkTypeSetExplicitly : boolean; - akttokenpos, { position of the last token } + current_tokenpos, { position of the last token } current_filepos : tfileposinfo; { current position } nwscreenname : string; diff --git a/compiler/parser.pas b/compiler/parser.pas index 5701072568..b0a4208f41 100644 --- a/compiler/parser.pas +++ b/compiler/parser.pas @@ -303,7 +303,7 @@ implementation oldtoken:=token; oldidtoken:=idtoken; old_block_type:=block_type; - oldtokenpos:=akttokenpos; + oldtokenpos:=current_tokenpos; { save cg } oldparse_only:=parse_only; { save akt... state } @@ -445,7 +445,7 @@ implementation orgpattern:=oldorgpattern; token:=oldtoken; idtoken:=oldidtoken; - akttokenpos:=oldtokenpos; + current_tokenpos:=oldtokenpos; block_type:=old_block_type; { restore cg } parse_only:=oldparse_only; diff --git a/compiler/pbase.pas b/compiler/pbase.pas index c744cdb225..89671facce 100644 --- a/compiler/pbase.pas +++ b/compiler/pbase.pas @@ -131,7 +131,7 @@ implementation else begin if token=_END then - last_endtoken_filepos:=akttokenpos; + last_endtoken_filepos:=current_tokenpos; current_scanner.readtoken(true); end; end; @@ -144,7 +144,7 @@ implementation begin try_to_consume:=true; if token=_END then - last_endtoken_filepos:=akttokenpos; + last_endtoken_filepos:=current_tokenpos; current_scanner.readtoken(true); end; end; diff --git a/compiler/pdecl.pas b/compiler/pdecl.pas index 48feda4cb7..047b9d9c0a 100644 --- a/compiler/pdecl.pas +++ b/compiler/pdecl.pas @@ -84,8 +84,8 @@ implementation internalerror(9584582); hp:=nil; p:=comp_expr(true); - storetokenpos:=akttokenpos; - akttokenpos:=filepos; + storetokenpos:=current_tokenpos; + current_tokenpos:=filepos; case p.nodetype of ordconstn: begin @@ -148,7 +148,7 @@ implementation else Message(parser_e_illegal_expression); end; - akttokenpos:=storetokenpos; + current_tokenpos:=storetokenpos; p.free; readconstant:=hp; end; @@ -170,7 +170,7 @@ implementation block_type:=bt_const; repeat orgname:=orgpattern; - filepos:=akttokenpos; + filepos:=current_tokenpos; consume(_ID); case token of @@ -201,10 +201,10 @@ implementation block_type:=bt_const; skipequal:=false; { create symbol } - storetokenpos:=akttokenpos; - akttokenpos:=filepos; + storetokenpos:=current_tokenpos; + current_tokenpos:=filepos; sym:=ttypedconstsym.create(orgname,hdef,(cs_typed_const_writable in current_settings.localswitches)); - akttokenpos:=storetokenpos; + current_tokenpos:=storetokenpos; symtablestack.top.insert(sym); { procvar can have proc directives, but not type references } if (hdef.deftype=procvardef) and @@ -312,8 +312,8 @@ implementation begin { try to resolve the forward } { get the correct position for it } - stpos:=akttokenpos; - akttokenpos:=tforwarddef(hpd).forwardpos; + stpos:=current_tokenpos; + current_tokenpos:=tforwarddef(hpd).forwardpos; resolving_forward:=true; make_ref:=false; if not assigned(tforwarddef(hpd).tosymname) then @@ -321,7 +321,7 @@ implementation searchsym(tforwarddef(hpd).tosymname^,srsym,srsymtable); make_ref:=true; resolving_forward:=false; - akttokenpos:=stpos; + current_tokenpos:=stpos; { we don't need the forwarddef anymore, dispose it } hpd.free; tabstractpointerdef(pd).pointeddef:=nil; { if error occurs } @@ -407,7 +407,7 @@ implementation block_type:=bt_type; typecanbeforward:=true; repeat - defpos:=akttokenpos; + defpos:=current_tokenpos; istyperenaming:=false; generictypelist:=nil; generictokenbuf:=nil; @@ -477,11 +477,11 @@ implementation referencing the type before it's really set it will give an error (PFV) } hdef:=generrordef; - storetokenpos:=akttokenpos; + storetokenpos:=current_tokenpos; newtype:=ttypesym.create(orgtypename,hdef); symtablestack.top.insert(newtype); - akttokenpos:=defpos; - akttokenpos:=storetokenpos; + current_tokenpos:=defpos; + current_tokenpos:=storetokenpos; { read the type definition } read_named_type(hdef,orgtypename,nil,generictypelist,false); { update the definition of the type } @@ -666,15 +666,15 @@ implementation block_type:=bt_const; repeat orgname:=orgpattern; - filepos:=akttokenpos; + filepos:=current_tokenpos; consume(_ID); case token of _EQUAL: begin consume(_EQUAL); p:=comp_expr(true); - storetokenpos:=akttokenpos; - akttokenpos:=filepos; + storetokenpos:=current_tokenpos; + current_tokenpos:=filepos; sym:=nil; case p.nodetype of ordconstn: @@ -699,7 +699,7 @@ implementation else Message(parser_e_illegal_expression); end; - akttokenpos:=storetokenpos; + current_tokenpos:=storetokenpos; { Support hint directives } dummysymoptions:=[]; try_consume_hintdirective(dummysymoptions); diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 192d261ae8..d72c143e0c 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -96,9 +96,9 @@ implementation not is_void(pd.returndef) and paramanager.ret_in_param(pd.returndef,pd.proccalloption) then begin - storepos:=akttokenpos; + storepos:=current_tokenpos; if pd.deftype=procdef then - akttokenpos:=tprocdef(pd).fileinfo; + current_tokenpos:=tprocdef(pd).fileinfo; { For left to right add it at the end to be delphi compatible } if pd.proccalloption in (pushleftright_pocalls+[pocall_safecall]) then @@ -112,7 +112,7 @@ implementation if pd.deftype=procdef then tprocdef(pd).funcretsym:=vs; - akttokenpos:=storepos; + current_tokenpos:=storepos; end; end; @@ -124,9 +124,9 @@ implementation begin if pd.parast.symtablelevel>normal_function_level then begin - storepos:=akttokenpos; + storepos:=current_tokenpos; if pd.deftype=procdef then - akttokenpos:=tprocdef(pd).fileinfo; + current_tokenpos:=tprocdef(pd).fileinfo; { Generate result variable accessing function result, it can't be put in a register since it must be accessable @@ -135,7 +135,7 @@ implementation vs.varregable:=vr_none; pd.parast.insert(vs); - akttokenpos:=storepos; + current_tokenpos:=storepos; end; end; @@ -160,8 +160,8 @@ implementation assigned(tprocdef(pd)._class) and (pd.parast.symtablelevel=normal_function_level) then begin - storepos:=akttokenpos; - akttokenpos:=tprocdef(pd).fileinfo; + storepos:=current_tokenpos; + current_tokenpos:=tprocdef(pd).fileinfo; { Generate VMT variable for constructor/destructor } if pd.proctypeoption in [potype_constructor,potype_destructor] then @@ -188,7 +188,7 @@ implementation vs:=tparavarsym.create('$self',paranr_self,vsp,hdef,[vo_is_self,vo_is_hidden_para]); pd.parast.insert(vs); - akttokenpos:=storepos; + current_tokenpos:=storepos; end; end; end; @@ -205,8 +205,8 @@ implementation if not(pd.proctypeoption in [potype_constructor,potype_destructor]) and not is_void(pd.returndef) then begin - storepos:=akttokenpos; - akttokenpos:=pd.fileinfo; + storepos:=current_tokenpos; + current_tokenpos:=pd.fileinfo; { We always need a localsymtable } if not assigned(pd.localst) then @@ -243,7 +243,7 @@ implementation tlocalsymtable(pd.localst).insert(aliasvs); end; - akttokenpos:=storepos; + current_tokenpos:=storepos; end; end; @@ -632,7 +632,7 @@ implementation popclass : boolean; begin { Save the position where this procedure really starts } - procstartfilepos:=akttokenpos; + procstartfilepos:=current_tokenpos; result:=false; pd:=nil; @@ -656,8 +656,8 @@ implementation (aclass.implementedinterfaces.count>0) and try_to_consume(_POINT) then begin - storepos:=akttokenpos; - akttokenpos:=procstartfilepos; + storepos:=current_tokenpos; + current_tokenpos:=procstartfilepos; { get interface syms} searchsym(sp,srsym,srsymtable); if not assigned(srsym) then @@ -665,7 +665,7 @@ implementation identifier_not_found(orgsp); srsym:=generrorsym; end; - akttokenpos:=storepos; + current_tokenpos:=storepos; { qualifier is interface? } if (srsym.typ=typesym) and (ttypesym(srsym).typedef.deftype=objectdef) then @@ -693,19 +693,19 @@ implementation try_to_consume(_POINT) then begin { search for object name } - storepos:=akttokenpos; - akttokenpos:=procstartfilepos; + storepos:=current_tokenpos; + current_tokenpos:=procstartfilepos; searchsym(sp,srsym,srsymtable); if not assigned(srsym) then begin identifier_not_found(orgsp); srsym:=generrorsym; end; - akttokenpos:=storepos; + current_tokenpos:=storepos; { consume proc name } sp:=pattern; orgsp:=orgpattern; - procstartfilepos:=akttokenpos; + procstartfilepos:=current_tokenpos; consume(_ID); { qualifier is class name ? } if (srsym.typ=typesym) and @@ -748,7 +748,7 @@ implementation repeat searchagain:=false; - akttokenpos:=procstartfilepos; + current_tokenpos:=procstartfilepos; srsymtable:=symtablestack.top; srsym:=tsym(srsymtable.search(sp)); @@ -795,7 +795,7 @@ implementation if not assigned(aprocsym) then begin { create a new procsym and set the real filepos } - akttokenpos:=procstartfilepos; + current_tokenpos:=procstartfilepos; { for operator we have only one procsym for each overloaded operation } if (potype=potype_operator) then diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index 52f4c32ee2..db841b8872 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -1077,7 +1077,7 @@ implementation membercall : boolean; callflags : tcallnodeflags; propaccesslist : tpropaccesslist; - + function getpropaccesslist(pap:tpropaccesslisttypes):boolean; var hpropsym : tpropertysym; @@ -1896,7 +1896,7 @@ implementation int_to_4cc(p1) else ok := false; - end; + end; if ok then begin p2:=comp_expr(true); @@ -2123,7 +2123,7 @@ implementation begin oldp1:=nil; p1:=nil; - filepos:=akttokenpos; + filepos:=current_tokenpos; again:=false; if token=_ID then begin @@ -2148,7 +2148,7 @@ implementation if assigned(p1) then p1.fileinfo:=filepos; oldp1:=p1; - filepos:=akttokenpos; + filepos:=current_tokenpos; end; { handle post fix operators } postfixoperators(p1,again); @@ -2610,7 +2610,7 @@ implementation ((token<>_EQUAL) or accept_equal) then begin oldt:=token; - filepos:=akttokenpos; + filepos:=current_tokenpos; consume(token); if pred_level=highest_precedence then p2:=factor(false) @@ -2717,7 +2717,7 @@ implementation { get the resultdef for this expression } if not assigned(p1.resultdef) then do_typecheckpass(p1); - filepos:=akttokenpos; + filepos:=current_tokenpos; if token in [_ASSIGNMENT,_PLUSASN,_MINUSASN,_STARASN,_SLASHASN] then afterassignment:=true; oldp1:=p1; diff --git a/compiler/pinline.pas b/compiler/pinline.pas index 40e64a35fc..99edbeb384 100644 --- a/compiler/pinline.pas +++ b/compiler/pinline.pas @@ -145,7 +145,7 @@ implementation { function styled new is handled in factor } { destructors have no parameters } destructorname:=pattern; - destructorpos:=akttokenpos; + destructorpos:=current_tokenpos; consume(_ID); if (p.resultdef.deftype<>pointerdef) then @@ -179,10 +179,10 @@ implementation exit; end; { search cons-/destructor, also in parent classes } - storepos:=akttokenpos; - akttokenpos:=destructorpos; + storepos:=current_tokenpos; + current_tokenpos:=destructorpos; sym:=search_class_member(classh,destructorname); - akttokenpos:=storepos; + current_tokenpos:=storepos; { the second parameter of new/dispose must be a call } { to a cons-/destructor } diff --git a/compiler/pstatmnt.pas b/compiler/pstatmnt.pas index eebce87634..a8b19b855b 100644 --- a/compiler/pstatmnt.pas +++ b/compiler/pstatmnt.pas @@ -923,7 +923,7 @@ implementation srsymtable : tsymtable; s : stringid; begin - filepos:=akttokenpos; + filepos:=current_tokenpos; case token of _GOTO : begin @@ -1088,7 +1088,7 @@ implementation begin first:=nil; - filepos:=akttokenpos; + filepos:=current_tokenpos; consume(starttoken); while not(token in [_END,_FINALIZATION]) do @@ -1189,7 +1189,7 @@ implementation { because the END is already read we need to get the last_endtoken_filepos here (PFV) } - last_endtoken_filepos:=akttokenpos; + last_endtoken_filepos:=current_tokenpos; assembler_block:=p; end; diff --git a/compiler/psub.pas b/compiler/psub.pas index d8772b162c..6da3ae0a7a 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -1701,7 +1701,7 @@ implementation internalerror(200512111); oldcurrent_filepos:=current_filepos; current_filepos:=tprocdef(tprocdef(hp).genericdef).fileinfo; - akttokenpos:=current_filepos; + current_tokenpos:=current_filepos; current_scanner.startreplaytokens(tprocdef(tprocdef(hp).genericdef).generictokenbuf); read_proc_body(nil,tprocdef(hp)); current_filepos:=oldcurrent_filepos; diff --git a/compiler/ptype.pas b/compiler/ptype.pas index 429fa1fc8d..e7074c43f7 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -168,7 +168,7 @@ implementation begin s:=pattern; sorg:=orgpattern; - pos:=akttokenpos; + pos:=current_tokenpos; { use of current parsed object: - classes can be used also in classes - objects can be parameters } @@ -617,7 +617,7 @@ implementation aktenumdef:=tenumdef.create; repeat s:=orgpattern; - defpos:=akttokenpos; + defpos:=current_tokenpos; consume(_ID); { only allow assigning of specific numbers under fpc mode } if not(m_tp7 in current_settings.modeswitches) and @@ -659,10 +659,10 @@ implementation else inc(l); first := false; - storepos:=akttokenpos; - akttokenpos:=defpos; + storepos:=current_tokenpos; + current_tokenpos:=defpos; tstoredsymtable(aktenumdef.owner).insert(tenumsym.create(s,aktenumdef,l)); - akttokenpos:=storepos; + current_tokenpos:=storepos; until not try_to_consume(_COMMA); def:=aktenumdef; consume(_RKLAMMER); diff --git a/compiler/scanner.pas b/compiler/scanner.pas index f95a02a29c..d5dbdee2e1 100644 --- a/compiler/scanner.pas +++ b/compiler/scanner.pas @@ -67,7 +67,7 @@ interface tcompile_time_predicate = function(var valuedescr: String) : Boolean; - tspecialgenerictoken = (ST_LOADSETTINGS); + tspecialgenerictoken = (ST_LOADSETTINGS,ST_LINE,ST_COLUMN,ST_FILEINDEX); tscannerfile = class public @@ -91,6 +91,9 @@ interface { last settings we stored } last_settings : tsettings; + { last filepos we stored } + last_filepos : tfileposinfo; + comment_level, yylexcount : longint; lastasmgetchar : char; @@ -1829,6 +1832,7 @@ In case not, the value returned can be arbitrary. internalerror(200511173); recordtokenbuf:=buf; fillchar(last_settings,sizeof(last_settings),0); + fillchar(last_filepos,sizeof(last_filepos),0); end; @@ -1853,6 +1857,30 @@ In case not, the value returned can be arbitrary. recordtokenbuf.write(current_settings,sizeof(current_settings)); last_settings:=current_settings; end; + + { file pos changes? } + if current_tokenpos.line<>last_filepos.line then + begin + recordtokenbuf.write(_GENERICSPECIALTOKEN,1); + recordtokenbuf.write(ST_LINE,1); + recordtokenbuf.write(current_tokenpos.line,sizeof(current_tokenpos.line)); + last_filepos.line:=current_tokenpos.line; + end; + if current_tokenpos.column<>last_filepos.column then + begin + recordtokenbuf.write(_GENERICSPECIALTOKEN,1); + recordtokenbuf.write(ST_COLUMN,1); + recordtokenbuf.write(current_tokenpos.column,sizeof(current_tokenpos.column)); + last_filepos.column:=current_tokenpos.column; + end; + if current_tokenpos.fileindex<>last_filepos.fileindex then + begin + recordtokenbuf.write(_GENERICSPECIALTOKEN,1); + recordtokenbuf.write(ST_FILEINDEX,1); + recordtokenbuf.write(current_tokenpos.fileindex,sizeof(current_tokenpos.fileindex)); + last_filepos.fileindex:=current_tokenpos.fileindex; + end; + recordtokenbuf.write(token,1); if token=_ID then recordtokenbuf.write(idtoken,1); @@ -1892,8 +1920,6 @@ In case not, the value returned can be arbitrary. { install buffer } replaytokenbuf:=buf; - fillchar(last_settings,sizeof(last_settings),0); - { reload next token } replaytokenbuf.seek(0); replaytoken; @@ -1950,9 +1976,13 @@ In case not, the value returned can be arbitrary. replaytokenbuf.read(specialtoken,1); case specialtoken of ST_LOADSETTINGS: - begin - replaytokenbuf.read(current_settings,sizeof(current_settings)); - end + replaytokenbuf.read(current_settings,sizeof(current_settings)); + ST_LINE: + replaytokenbuf.read(current_tokenpos.line,sizeof(current_tokenpos.line)); + ST_COLUMN: + replaytokenbuf.read(current_tokenpos.column,sizeof(current_tokenpos.column)); + ST_FILEINDEX: + replaytokenbuf.read(current_tokenpos.fileindex,sizeof(current_tokenpos.fileindex)); else internalerror(2006103010); end; @@ -2082,11 +2112,11 @@ In case not, the value returned can be arbitrary. { load the values of tokenpos and lasttokenpos } begin lasttokenpos:=inputstart+(inputpointer-inputbuffer); - akttokenpos.line:=line_no; - akttokenpos.column:=lasttokenpos-lastlinepos; - akttokenpos.fileindex:=inputfile.ref_index; - akttokenpos.moduleindex:=current_module.unit_index; - current_filepos:=akttokenpos; + current_tokenpos.line:=line_no; + current_tokenpos.column:=lasttokenpos-lastlinepos; + current_tokenpos.fileindex:=inputfile.ref_index; + current_tokenpos.moduleindex:=current_module.unit_index; + current_filepos:=current_tokenpos; end; @@ -2149,12 +2179,12 @@ In case not, the value returned can be arbitrary. { update for status and call the show status routine, but don't touch current_filepos ! } oldcurrent_filepos:=current_filepos; - oldtokenpos:=akttokenpos; + oldtokenpos:=current_tokenpos; gettokenpos; { update for v_status } inc(status.compiledlines); ShowStatus; current_filepos:=oldcurrent_filepos; - akttokenpos:=oldtokenpos; + current_tokenpos:=oldtokenpos; end; end; diff --git a/compiler/symdef.pas b/compiler/symdef.pas index 2dd7e1eca3..dde2e0fe01 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -2529,10 +2529,10 @@ implementation begin if (ado_IsBitPacked in arrayoptions) then internalerror(2006080101); - if assigned(_elementdef) then + if assigned(_elementdef) then result:=_elementdef.size else - result:=0; + result:=0; end; @@ -2540,10 +2540,10 @@ implementation begin if not(ado_IsBitPacked in arrayoptions) then internalerror(2006080102); - if assigned(_elementdef) then + if assigned(_elementdef) then result:=_elementdef.packedbitsize else - result:=0; + result:=0; end; @@ -3263,7 +3263,7 @@ implementation refcount:=0; if (cs_browser in current_settings.moduleswitches) and make_ref then begin - defref:=tref.create(defref,@akttokenpos); + defref:=tref.create(defref,@current_tokenpos); inc(refcount); end; lastref:=defref; diff --git a/compiler/symtable.pas b/compiler/symtable.pas index 8fabea0969..e674d4496c 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -1640,7 +1640,7 @@ implementation if (cs_browser in current_settings.moduleswitches) then begin - newref:=tref.create(sym.lastref,@akttokenpos); + newref:=tref.create(sym.lastref,@current_tokenpos); { for symbols that are in tables without browser info or syssyms } if sym.refcount=0 then begin diff --git a/compiler/symtype.pas b/compiler/symtype.pas index 0191220098..13d1b1acd8 100644 --- a/compiler/symtype.pas +++ b/compiler/symtype.pas @@ -311,10 +311,10 @@ implementation refs:=0; lastwritten:=nil; refcount:=0; - fileinfo:=akttokenpos; + fileinfo:=current_tokenpos; if (cs_browser in current_settings.moduleswitches) and make_ref then begin - defref:=tref.create(defref,@akttokenpos); + defref:=tref.create(defref,@current_tokenpos); inc(refcount); end; lastref:=defref; diff --git a/compiler/utils/ppudump.pp b/compiler/utils/ppudump.pp index e58305dbd5..9b6d063b09 100644 --- a/compiler/utils/ppudump.pp +++ b/compiler/utils/ppudump.pp @@ -58,6 +58,9 @@ type ); tprocinfoflags=set of tprocinfoflag; + { copied from scanner.pas } + tspecialgenerictoken = (ST_LOADSETTINGS,ST_LINE,ST_COLUMN,ST_FILEINDEX); + { Copied from systems.pas } tsystemcpu= ( @@ -873,7 +876,8 @@ begin write(space,' Tokens: '); while i_GENERICSPECIALTOKEN then + write(arraytokeninfo[ttoken(tokenbuf[i])].str); case ttoken(tokenbuf[i]) of _CWCHAR, _CWSTRING : @@ -901,6 +905,9 @@ begin _ID : begin inc(i); + inc(i); + write(' ',pshortstring(@tokenbuf[i])^); + inc(i,tokenbuf[i]+1); { replaytokenbuf.read(orgpattern[0],1); replaytokenbuf.read(orgpattern[1],length(orgpattern)); @@ -910,9 +917,32 @@ begin _GENERICSPECIALTOKEN: begin inc(i); - inc(i); - inc(i,sizeof(tsettings)); - + case tspecialgenerictoken(tokenbuf[i]) of + ST_LOADSETTINGS: + begin + inc(i); + write('Settings'); + inc(i,sizeof(tsettings)); + end; + ST_LINE: + begin + inc(i); + write('Line: ',pdword(@tokenbuf[i])^); + inc(i,4); + end; + ST_COLUMN: + begin + inc(i); + write('Col: ',pword(@tokenbuf[i])^); + inc(i,2); + end; + ST_FILEINDEX: + begin + inc(i); + write('File: ',pword(@tokenbuf[i])^); + inc(i,2); + end; + end; { replaytokenbuf.read(specialtoken,1); case specialtoken of