Checking For Special Words

Turbo Pascal uses few special words as directives for special functions: ABSOLUTE, ASSEMBLER, EXTERNAL, FAR, FORWARD, INTERRUPT, NEAR, PRIVATE, PUBLIC, VIRTUAL and System as unit name.
    TSpecialWord = Record
                     Text: String [9];
                     Hash: Byte;
                   end;
  _ABSOLUTE: TSpecialWord = (Text: 'ABSOLUTE'; Hash: $AE);
  _ASSEMBLER: TSpecialWord = (Text: 'ASSEMBLER'; Hash: $2A);
  _EXTERNAL: TSpecialWord = (Text: 'EXTERNAL'; Hash: $B6);
  _FAR: TSpecialWord = (Text: 'FAR'; Hash: $AC);
  _FORWARD: TSpecialWord = (Text: 'FORWARD'; Hash: $1C);
  _INTERRUPT: TSpecialWord = (Text: 'INTERRUPT'; Hash: $88);
  _NEAR: TSpecialWord = (Text: 'NEAR'; Hash: $44);
  _PRIVATE: TSpecialWord = (Text: 'PRIVATE'; Hash: $28);
  _PUBLIC: TSpecialWord = (Text: 'PUBLIC'; Hash: $72);
  _VIRTUAL: TSpecialWord = (Text: 'VIRTUAL'; Hash: $40);
  _System: TSpecialWord = (Text: 'System'; Hash: $BE);
This function checks if special directive is present.
Procedure CheckIfDirecive (Directive: TSpecialWord; NewToken: TToken);
begin
  If CompareIdentifierToWord (Directive) then Token := NewToken;
end;
This function actually compares current identifier with each of special words. To speed up the search the hash value is compared first, then IdentifiersEqual is called.
Function CompareIdentifierToWord (SpecialWord: TSpecialWord): Boolean;
Var TempPtr: PString;
begin
  CompareIdentifierToWord := False;
  If Token <> Token_Identifier then Exit;
  If CurrentIdentifierHash <> SpecialWord.Hash then Exit;
  TempPtr := @SpecialWord.Text;
  If not IdentifiersEqual (@CurrentIdentifier, TempPtr) then Exit;
  CompareIdentifierToWord := True;
end;
 
 
 
© 2017 Turbo Pascal | Privacy Policy