* scanner object to class

This commit is contained in:
peter 2001-04-13 18:20:21 +00:00
parent fdeadeed22
commit f0a0c63c77
3 changed files with 124 additions and 115 deletions

View File

@ -277,10 +277,10 @@ begin
actasmpattern:=''; actasmpattern:='';
{ while space and tab , continue scan... } { while space and tab , continue scan... }
while c in [' ',#9] do while c in [' ',#9] do
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
{ get token pos } { get token pos }
if not (c in [newline,#13,'{',';']) then if not (c in [newline,#13,'{',';']) then
current_scanner^.gettokenpos; current_scanner.gettokenpos;
{ Local Label, Label, Directive, Prefix or Opcode } { Local Label, Label, Directive, Prefix or Opcode }
if firsttoken and not(c in [newline,#13,'{',';']) then if firsttoken and not(c in [newline,#13,'{',';']) then
begin begin
@ -292,12 +292,12 @@ begin
inc(len); inc(len);
actasmpattern[len]:=c; actasmpattern[len]:=c;
{ Let us point to the next character } { Let us point to the next character }
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['A'..'Z','a'..'z','0'..'9','_','$'] do while c in ['A'..'Z','a'..'z','0'..'9','_','$'] do
begin begin
inc(len); inc(len);
actasmpattern[len]:=c; actasmpattern[len]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern[0]:=chr(len); actasmpattern[0]:=chr(len);
{ this is a local label... } { this is a local label... }
@ -305,7 +305,7 @@ begin
Begin Begin
{ local variables are case sensitive } { local variables are case sensitive }
actasmtoken:=AS_LLABEL; actasmtoken:=AS_LLABEL;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
firsttoken:=true; firsttoken:=true;
exit; exit;
end end
@ -323,7 +323,7 @@ begin
begin begin
inc(len); inc(len);
actasmpattern[len]:=c; actasmpattern[len]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern[0]:=chr(len); actasmpattern[0]:=chr(len);
{ Label ? } { Label ? }
@ -331,7 +331,7 @@ begin
begin begin
actasmtoken:=AS_LABEL; actasmtoken:=AS_LABEL;
{ let us point to the next character } { let us point to the next character }
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
firsttoken:=true; firsttoken:=true;
exit; exit;
end; end;
@ -360,16 +360,16 @@ begin
begin begin
if (prevasmtoken in [AS_ID,AS_RPAREN]) then if (prevasmtoken in [AS_ID,AS_RPAREN]) then
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
actasmtoken:=AS_DOT; actasmtoken:=AS_DOT;
exit; exit;
end; end;
actasmpattern:=c; actasmpattern:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['A'..'Z','a'..'z','0'..'9','_','$'] do while c in ['A'..'Z','a'..'z','0'..'9','_','$'] do
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
if is_asmdirective(actasmpattern) then if is_asmdirective(actasmpattern) then
exit; exit;
@ -387,7 +387,7 @@ begin
begin begin
inc(len); inc(len);
actasmpattern[len]:=c; actasmpattern[len]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern[0]:=chr(len); actasmpattern[0]:=chr(len);
uppervar(actasmpattern); uppervar(actasmpattern);
@ -416,7 +416,7 @@ begin
begin begin
len:=1; len:=1;
actasmpattern[len]:='%'; actasmpattern[len]:='%';
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
{ to be a register there must be a letter and not a number } { to be a register there must be a letter and not a number }
if c in ['0'..'9'] then if c in ['0'..'9'] then
begin begin
@ -429,25 +429,25 @@ begin
Begin Begin
inc(len); inc(len);
actasmpattern[len]:=c; actasmpattern[len]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern[0]:=chr(len); actasmpattern[0]:=chr(len);
uppervar(actasmpattern); uppervar(actasmpattern);
if (actasmpattern = '%ST') and (c='(') then if (actasmpattern = '%ST') and (c='(') then
Begin Begin
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c in ['0'..'9'] then if c in ['0'..'9'] then
actasmpattern:=actasmpattern + c actasmpattern:=actasmpattern + c
else else
Message(asmr_e_invalid_fpu_register); Message(asmr_e_invalid_fpu_register);
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c <> ')' then if c <> ')' then
Message(asmr_e_invalid_fpu_register) Message(asmr_e_invalid_fpu_register)
else else
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; { let us point to next character. } c:=current_scanner.asmgetchar; { let us point to next character. }
end; end;
end; end;
if is_register(actasmpattern) then if is_register(actasmpattern) then
@ -464,7 +464,7 @@ begin
Begin Begin
inc(len); inc(len);
actasmpattern[len]:=c; actasmpattern[len]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern[0]:=chr(len); actasmpattern[0]:=chr(len);
actasmpattern:=tostr(ValDecimal(actasmpattern)); actasmpattern:=tostr(ValDecimal(actasmpattern));
@ -474,15 +474,15 @@ begin
'0' : { octal,hexa,real or binary number. } '0' : { octal,hexa,real or binary number. }
begin begin
actasmpattern:=c; actasmpattern:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
case upcase(c) of case upcase(c) of
'B': { binary } 'B': { binary }
Begin Begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['0','1'] do while c in ['0','1'] do
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern:=tostr(ValBinary(actasmpattern)); actasmpattern:=tostr(ValBinary(actasmpattern));
actasmtoken:=AS_INTNUM; actasmtoken:=AS_INTNUM;
@ -490,42 +490,42 @@ begin
end; end;
'D': { real } 'D': { real }
Begin Begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
{ get ridd of the 0d } { get ridd of the 0d }
if (c in ['+','-']) then if (c in ['+','-']) then
begin begin
actasmpattern:=c; actasmpattern:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end end
else else
actasmpattern:=''; actasmpattern:='';
while c in ['0'..'9'] do while c in ['0'..'9'] do
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
if c='.' then if c='.' then
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['0'..'9'] do while c in ['0'..'9'] do
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
if upcase(c) = 'E' then if upcase(c) = 'E' then
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if (c in ['+','-']) then if (c in ['+','-']) then
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
while c in ['0'..'9'] do while c in ['0'..'9'] do
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
end; end;
actasmtoken:=AS_REALNUM; actasmtoken:=AS_REALNUM;
@ -539,11 +539,11 @@ begin
end; end;
'X': { hexadecimal } 'X': { hexadecimal }
Begin Begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['0'..'9','a'..'f','A'..'F'] do while c in ['0'..'9','a'..'f','A'..'F'] do
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern:=tostr(ValHexaDecimal(actasmpattern)); actasmpattern:=tostr(ValHexaDecimal(actasmpattern));
actasmtoken:=AS_INTNUM; actasmtoken:=AS_INTNUM;
@ -555,7 +555,7 @@ begin
while c in ['0'..'7'] do while c in ['0'..'7'] do
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern:=tostr(ValOctal(actasmpattern)); actasmpattern:=tostr(ValOctal(actasmpattern));
actasmtoken:=AS_INTNUM; actasmtoken:=AS_INTNUM;
@ -572,27 +572,27 @@ begin
'&' : '&' :
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
actasmtoken:=AS_AND; actasmtoken:=AS_AND;
end; end;
'''' : { char } '''' : { char }
begin begin
current_scanner^.in_asm_string:=true; current_scanner.in_asm_string:=true;
actasmpattern:=''; actasmpattern:='';
repeat repeat
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
case c of case c of
'\' : '\' :
begin begin
{ copy also the next char so \" is parsed correctly } { copy also the next char so \" is parsed correctly }
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
end; end;
'''' : '''' :
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
break; break;
end; end;
newline: newline:
@ -603,27 +603,27 @@ begin
until false; until false;
actasmpattern:=EscapeToPascal(actasmpattern); actasmpattern:=EscapeToPascal(actasmpattern);
actasmtoken:=AS_STRING; actasmtoken:=AS_STRING;
current_scanner^.in_asm_string:=false; current_scanner.in_asm_string:=false;
exit; exit;
end; end;
'"' : { string } '"' : { string }
begin begin
current_scanner^.in_asm_string:=true; current_scanner.in_asm_string:=true;
actasmpattern:=''; actasmpattern:='';
repeat repeat
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
case c of case c of
'\' : '\' :
begin begin
{ copy also the next char so \" is parsed correctly } { copy also the next char so \" is parsed correctly }
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
end; end;
'"' : '"' :
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
break; break;
end; end;
newline: newline:
@ -634,60 +634,60 @@ begin
until false; until false;
actasmpattern:=EscapeToPascal(actasmpattern); actasmpattern:=EscapeToPascal(actasmpattern);
actasmtoken:=AS_STRING; actasmtoken:=AS_STRING;
current_scanner^.in_asm_string:=false; current_scanner.in_asm_string:=false;
exit; exit;
end; end;
'$' : '$' :
begin begin
actasmtoken:=AS_DOLLAR; actasmtoken:=AS_DOLLAR;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
',' : ',' :
begin begin
actasmtoken:=AS_COMMA; actasmtoken:=AS_COMMA;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'<' : '<' :
begin begin
actasmtoken:=AS_SHL; actasmtoken:=AS_SHL;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c = '<' then if c = '<' then
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'>' : '>' :
begin begin
actasmtoken:=AS_SHL; actasmtoken:=AS_SHL;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c = '>' then if c = '>' then
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'|' : '|' :
begin begin
actasmtoken:=AS_OR; actasmtoken:=AS_OR;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'^' : '^' :
begin begin
actasmtoken:=AS_XOR; actasmtoken:=AS_XOR;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'!' : '!' :
begin begin
Message(asmr_e_nor_not_supported); Message(asmr_e_nor_not_supported);
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
actasmtoken:=AS_NONE; actasmtoken:=AS_NONE;
exit; exit;
end; end;
@ -695,48 +695,48 @@ begin
'(' : '(' :
begin begin
actasmtoken:=AS_LPAREN; actasmtoken:=AS_LPAREN;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
')' : ')' :
begin begin
actasmtoken:=AS_RPAREN; actasmtoken:=AS_RPAREN;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
':' : ':' :
begin begin
actasmtoken:=AS_COLON; actasmtoken:=AS_COLON;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'+' : '+' :
begin begin
actasmtoken:=AS_PLUS; actasmtoken:=AS_PLUS;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'-' : '-' :
begin begin
actasmtoken:=AS_MINUS; actasmtoken:=AS_MINUS;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'*' : '*' :
begin begin
actasmtoken:=AS_STAR; actasmtoken:=AS_STAR;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'/' : '/' :
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
actasmtoken:=AS_SLASH; actasmtoken:=AS_SLASH;
exit; exit;
end; end;
@ -744,14 +744,14 @@ begin
'{',#13,newline,';' : '{',#13,newline,';' :
begin begin
{ the comment is read by asmgetchar } { the comment is read by asmgetchar }
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
firsttoken:=TRUE; firsttoken:=TRUE;
actasmtoken:=AS_SEPARATOR; actasmtoken:=AS_SEPARATOR;
exit; exit;
end; end;
else else
current_scanner^.illegal_char(c); current_scanner.illegal_char(c);
end; end;
end; end;
end; end;
@ -1887,7 +1887,7 @@ Begin
{ setup label linked list } { setup label linked list }
LocalLabelList:=TLocalLabelList.Create; LocalLabelList:=TLocalLabelList.Create;
{ start tokenizer } { start tokenizer }
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
gettoken; gettoken;
{ main loop } { main loop }
repeat repeat
@ -2119,7 +2119,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.9 2001-04-13 01:22:21 peter Revision 1.10 2001-04-13 18:20:21 peter
* scanner object to class
Revision 1.9 2001/04/13 01:22:21 peter
* symtable change to classes * symtable change to classes
* range check generation and errors fixed, make cycle DEBUG=1 works * range check generation and errors fixed, make cycle DEBUG=1 works
* memory leaks fixed * memory leaks fixed

View File

@ -95,15 +95,15 @@ interface
retstr:=upper(tostr(procinfo^.return_offset)+'('+att_reg2str[procinfo^.framepointer]+')') retstr:=upper(tostr(procinfo^.return_offset)+'('+att_reg2str[procinfo^.framepointer]+')')
else else
retstr:=''; retstr:='';
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
code:=TAAsmoutput.Create; code:=TAAsmoutput.Create;
while not(ende) do while not(ende) do
begin begin
{ wrong placement { wrong placement
current_scanner^.gettokenpos; } current_scanner.gettokenpos; }
case c of case c of
'A'..'Z','a'..'z','_' : begin 'A'..'Z','a'..'z','_' : begin
current_scanner^.gettokenpos; current_scanner.gettokenpos;
i:=0; i:=0;
hs:=''; hs:='';
while ((ord(c)>=ord('A')) and (ord(c)<=ord('Z'))) while ((ord(c)>=ord('A')) and (ord(c)<=ord('Z')))
@ -113,7 +113,7 @@ interface
begin begin
inc(i); inc(i);
hs[i]:=c; hs[i]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
hs[0]:=chr(i); hs[0]:=chr(i);
if upper(hs)='END' then if upper(hs)='END' then
@ -268,15 +268,15 @@ interface
if pos(retstr,s) > 0 then if pos(retstr,s) > 0 then
procinfo^.funcret_state:=vs_assigned; procinfo^.funcret_state:=vs_assigned;
writeasmline; writeasmline;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
#26 : Message(scan_f_end_of_file); #26 : Message(scan_f_end_of_file);
else else
begin begin
current_scanner^.gettokenpos; current_scanner.gettokenpos;
inc(byte(s[0])); inc(byte(s[0]));
s[length(s)]:=c; s[length(s)]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
end; end;
end; end;
@ -287,7 +287,10 @@ interface
end. end.
{ {
$Log$ $Log$
Revision 1.7 2001-04-13 01:22:21 peter Revision 1.8 2001-04-13 18:20:21 peter
* scanner object to class
Revision 1.7 2001/04/13 01:22:21 peter
* symtable change to classes * symtable change to classes
* range check generation and errors fixed, make cycle DEBUG=1 works * range check generation and errors fixed, make cycle DEBUG=1 works
* memory leaks fixed * memory leaks fixed

View File

@ -267,10 +267,10 @@ begin
actasmpattern:=''; actasmpattern:='';
{ while space and tab , continue scan... } { while space and tab , continue scan... }
while (c in [' ',#9]) do while (c in [' ',#9]) do
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
{ get token pos } { get token pos }
if not (c in [newline,#13,'{',';']) then if not (c in [newline,#13,'{',';']) then
current_scanner^.gettokenpos; current_scanner.gettokenpos;
{ Local Label, Label, Directive, Prefix or Opcode } { Local Label, Label, Directive, Prefix or Opcode }
if firsttoken and not (c in [newline,#13,'{',';']) then if firsttoken and not (c in [newline,#13,'{',';']) then
begin begin
@ -283,7 +283,7 @@ begin
forcelabel:=TRUE; forcelabel:=TRUE;
inc(len); inc(len);
actasmpattern[len]:=c; actasmpattern[len]:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern[0]:=chr(len); actasmpattern[0]:=chr(len);
uppervar(actasmpattern); uppervar(actasmpattern);
@ -295,7 +295,7 @@ begin
else else
actasmtoken:=AS_LABEL; actasmtoken:=AS_LABEL;
{ let us point to the next character } { let us point to the next character }
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
firsttoken:=true; firsttoken:=true;
exit; exit;
end; end;
@ -324,11 +324,11 @@ begin
{ - @Result, @Code or @Data special variables. } { - @Result, @Code or @Data special variables. }
begin begin
actasmpattern:=c; actasmpattern:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['A'..'Z','a'..'z','0'..'9','_','@'] do while c in ['A'..'Z','a'..'z','0'..'9','_','@'] do
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
uppervar(actasmpattern); uppervar(actasmpattern);
actasmtoken:=AS_ID; actasmtoken:=AS_ID;
@ -338,11 +338,11 @@ begin
'A'..'Z','a'..'z','_': { identifier, register, opcode, prefix or directive } 'A'..'Z','a'..'z','_': { identifier, register, opcode, prefix or directive }
begin begin
actasmpattern:=c; actasmpattern:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['A'..'Z','a'..'z','0'..'9','_'] do while c in ['A'..'Z','a'..'z','0'..'9','_'] do
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
uppervar(actasmpattern); uppervar(actasmpattern);
{ after prefix we allow also a new opcode } { after prefix we allow also a new opcode }
@ -358,18 +358,18 @@ begin
if (actasmpattern = 'ST') and (c='(') then if (actasmpattern = 'ST') and (c='(') then
Begin Begin
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c in ['0'..'7'] then if c in ['0'..'7'] then
actasmpattern:=actasmpattern + c actasmpattern:=actasmpattern + c
else else
Message(asmr_e_invalid_fpu_register); Message(asmr_e_invalid_fpu_register);
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c <> ')' then if c <> ')' then
Message(asmr_e_invalid_fpu_register) Message(asmr_e_invalid_fpu_register)
else else
Begin Begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
end; end;
if is_register(actasmpattern) then if is_register(actasmpattern) then
@ -385,18 +385,18 @@ begin
'&' : { override operator... not supported } '&' : { override operator... not supported }
begin begin
Message(asmr_w_override_op_not_supported); Message(asmr_w_override_op_not_supported);
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
actasmtoken:=AS_NONE; actasmtoken:=AS_NONE;
end; end;
'''' : { string or character } '''' : { string or character }
begin begin
actasmpattern:=''; actasmpattern:='';
current_scanner^.in_asm_string:=true; current_scanner.in_asm_string:=true;
repeat repeat
if c = '''' then if c = '''' then
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c=newline then if c=newline then
begin begin
Message(scan_f_string_exceeds_line); Message(scan_f_string_exceeds_line);
@ -405,11 +405,11 @@ begin
repeat repeat
if c='''' then if c='''' then
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c='''' then if c='''' then
begin begin
actasmpattern:=actasmpattern+''''; actasmpattern:=actasmpattern+'''';
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c=newline then if c=newline then
begin begin
Message(scan_f_string_exceeds_line); Message(scan_f_string_exceeds_line);
@ -422,7 +422,7 @@ begin
else else
begin begin
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c=newline then if c=newline then
begin begin
Message(scan_f_string_exceeds_line); Message(scan_f_string_exceeds_line);
@ -434,19 +434,19 @@ begin
else else
break; { end if } break; { end if }
until false; until false;
current_scanner^.in_asm_string:=false; current_scanner.in_asm_string:=false;
actasmtoken:=AS_STRING; actasmtoken:=AS_STRING;
exit; exit;
end; end;
'"' : { string or character } '"' : { string or character }
begin begin
current_scanner^.in_asm_string:=true; current_scanner.in_asm_string:=true;
actasmpattern:=''; actasmpattern:='';
repeat repeat
if c = '"' then if c = '"' then
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c=newline then if c=newline then
begin begin
Message(scan_f_string_exceeds_line); Message(scan_f_string_exceeds_line);
@ -455,11 +455,11 @@ begin
repeat repeat
if c='"' then if c='"' then
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c='"' then if c='"' then
begin begin
actasmpattern:=actasmpattern+'"'; actasmpattern:=actasmpattern+'"';
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c=newline then if c=newline then
begin begin
Message(scan_f_string_exceeds_line); Message(scan_f_string_exceeds_line);
@ -472,7 +472,7 @@ begin
else else
begin begin
actasmpattern:=actasmpattern+c; actasmpattern:=actasmpattern+c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
if c=newline then if c=newline then
begin begin
Message(scan_f_string_exceeds_line); Message(scan_f_string_exceeds_line);
@ -484,18 +484,18 @@ begin
else else
break; { end if } break; { end if }
until false; until false;
current_scanner^.in_asm_string:=false; current_scanner.in_asm_string:=false;
actasmtoken:=AS_STRING; actasmtoken:=AS_STRING;
exit; exit;
end; end;
'$' : '$' :
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
while c in ['0'..'9','A'..'F','a'..'f'] do while c in ['0'..'9','A'..'F','a'..'f'] do
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
actasmpattern:=tostr(ValHexaDecimal(actasmpattern)); actasmpattern:=tostr(ValHexaDecimal(actasmpattern));
actasmtoken:=AS_INTNUM; actasmtoken:=AS_INTNUM;
@ -505,89 +505,89 @@ begin
',' : ',' :
begin begin
actasmtoken:=AS_COMMA; actasmtoken:=AS_COMMA;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'[' : '[' :
begin begin
actasmtoken:=AS_LBRACKET; actasmtoken:=AS_LBRACKET;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
']' : ']' :
begin begin
actasmtoken:=AS_RBRACKET; actasmtoken:=AS_RBRACKET;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'(' : '(' :
begin begin
actasmtoken:=AS_LPAREN; actasmtoken:=AS_LPAREN;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
')' : ')' :
begin begin
actasmtoken:=AS_RPAREN; actasmtoken:=AS_RPAREN;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
':' : ':' :
begin begin
actasmtoken:=AS_COLON; actasmtoken:=AS_COLON;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'.' : '.' :
begin begin
actasmtoken:=AS_DOT; actasmtoken:=AS_DOT;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'+' : '+' :
begin begin
actasmtoken:=AS_PLUS; actasmtoken:=AS_PLUS;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'-' : '-' :
begin begin
actasmtoken:=AS_MINUS; actasmtoken:=AS_MINUS;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'*' : '*' :
begin begin
actasmtoken:=AS_STAR; actasmtoken:=AS_STAR;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'/' : '/' :
begin begin
actasmtoken:=AS_SLASH; actasmtoken:=AS_SLASH;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'0'..'9': '0'..'9':
begin begin
actasmpattern:=c; actasmpattern:=c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
{ Get the possible characters } { Get the possible characters }
while c in ['0'..'9','A'..'F','a'..'f'] do while c in ['0'..'9','A'..'F','a'..'f'] do
begin begin
actasmpattern:=actasmpattern + c; actasmpattern:=actasmpattern + c;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
end; end;
{ Get ending character } { Get ending character }
uppervar(actasmpattern); uppervar(actasmpattern);
@ -608,14 +608,14 @@ begin
Begin Begin
actasmpattern:=tostr(ValOctal(actasmpattern)); actasmpattern:=tostr(ValOctal(actasmpattern));
actasmtoken:=AS_INTNUM; actasmtoken:=AS_INTNUM;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
'H' : 'H' :
Begin Begin
actasmpattern:=tostr(ValHexaDecimal(actasmpattern)); actasmpattern:=tostr(ValHexaDecimal(actasmpattern));
actasmtoken:=AS_INTNUM; actasmtoken:=AS_INTNUM;
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
exit; exit;
end; end;
else { must be an integer number } else { must be an integer number }
@ -630,14 +630,14 @@ begin
';','{',#13,newline : ';','{',#13,newline :
begin begin
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
firsttoken:=TRUE; firsttoken:=TRUE;
actasmtoken:=AS_SEPARATOR; actasmtoken:=AS_SEPARATOR;
exit; exit;
end; end;
else else
current_scanner^.illegal_char(c); current_scanner.illegal_char(c);
end; end;
end; end;
end; end;
@ -1841,7 +1841,7 @@ Begin
{ setup label linked list } { setup label linked list }
LocalLabelList:=TLocalLabelList.Create; LocalLabelList:=TLocalLabelList.Create;
{ start tokenizer } { start tokenizer }
c:=current_scanner^.asmgetchar; c:=current_scanner.asmgetchar;
gettoken; gettoken;
{ main loop } { main loop }
repeat repeat
@ -1948,7 +1948,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.12 2001-04-13 01:22:21 peter Revision 1.13 2001-04-13 18:20:21 peter
* scanner object to class
Revision 1.12 2001/04/13 01:22:21 peter
* symtable change to classes * symtable change to classes
* range check generation and errors fixed, make cycle DEBUG=1 works * range check generation and errors fixed, make cycle DEBUG=1 works
* memory leaks fixed * memory leaks fixed