Ignore:
Timestamp:
Oct 15, 2012, 12:00:21 PM (12 years ago)
Author:
chronos
Message:
  • Upraveno: Rozšířeno převádění kódu na další případy.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/AS8051toC/UParser.pas

    r22 r25  
    1717  TErrorEvent = procedure (Message: string) of object;
    1818
     19
    1920  { TParser }
    2021
     
    2324    FOnError: TErrorEvent;
    2425  public
     26    procedure Error(Text: string); virtual;
     27    function Expect(Text: string): Boolean; virtual;
     28    function GetNext(ChangePos: Boolean = False): string; virtual;
     29    function ReadNext: string; virtual;
     30    property OnError: TErrorEvent read FOnError write FOnError;
     31  end;
     32
     33  { TParserASM51 }
     34
     35  TParserASM51 = class(TParser)
     36  public
    2537    Source: string;
    2638    Position: Integer;
    27     procedure Error(Text: string);
    28     function Expect(Text: string): Boolean;
    29     function GetNext(ChangePos: Boolean = False): string;
    30     function ReadNext: string;
     39    function Expect(Text: string): Boolean; override;
     40    function GetNext(ChangePos: Boolean = False): string; override;
     41    function ReadNext: string; override;
    3142    function ReadChar: Char;
    3243    function NextChar: Char;
     
    3950    function IsKeyword(Text: string): Boolean;
    4051    function IsNumber(Text: string): Boolean;
     52    function IsHexNumber(Text: string): Boolean;
    4153    function IsString(Text: string): Boolean;
    4254    function IsWhiteSpace(Character: char): boolean;
    4355    function Eof: Boolean;
    44     property OnError: TErrorEvent read FOnError write FOnError;
     56  end;
     57
     58  TParserMacro = class
     59
    4560  end;
    4661
     
    4863implementation
    4964
    50 { TParser }
    51 
    5265procedure TParser.Error(Text: string);
    5366begin
     
    5669
    5770function TParser.Expect(Text: string): Boolean;
     71begin
     72
     73end;
     74
     75function TParser.GetNext(ChangePos: Boolean): string;
     76begin
     77
     78end;
     79
     80function TParser.ReadNext: string;
     81begin
     82
     83end;
     84
     85{ TParserASM51 }
     86
     87function TParserASM51.Expect(Text: string): Boolean;
    5888var
    5989  NextToken: string;
     
    6494end;
    6595
    66 function TParser.GetNext(ChangePos: Boolean = False): string;
     96function TParserASM51.GetNext(ChangePos: Boolean = False): string;
    6797var
    6898  OldPosition: Integer;
     
    77107    end;
    78108  end else
    79   if IsNumeric(NextChar) then begin
     109  if IsHex(NextChar) then begin
    80110    Result := ReadChar;
    81     while IsNumeric(NextChar) do begin
     111    while IsHex(NextChar) do begin
    82112      Result := Result + ReadChar;
    83113    end;
     114    if NextChar = 'h' then Result := Result + ReadChar;
     115//    else
    84116  end else Result := ReadChar;
    85117  if not ChangePos then Position := OldPosition;
    86118end;
    87119
    88 function TParser.ReadNext: string;
     120function TParserASM51.ReadNext: string;
    89121begin
    90122  Result := GetNext(True);
    91123end;
    92124
    93 function TParser.ReadChar: Char;
     125function TParserASM51.ReadChar: Char;
    94126begin
    95127  Result := NextChar;
     
    97129end;
    98130
    99 function TParser.NextChar: Char;
     131function TParserASM51.NextChar: Char;
    100132begin
    101133  Result := Source[Position];
    102134end;
    103135
    104 function TParser.ReadEol: string;
     136function TParserASM51.ReadEol: string;
    105137begin
    106138  Result := '';
     
    112144end;
    113145
    114 function TParser.IsAlphabetic(Character: char): boolean;
     146function TParserASM51.IsAlphabetic(Character: char): boolean;
    115147begin
    116148  Result := (Character in ['a'..'z']) or (Character in ['A'..'Z']);
    117149end;
    118150
    119 function TParser.IsAlphanumeric(Character: char): boolean;
     151function TParserASM51.IsAlphanumeric(Character: char): boolean;
    120152begin
    121153  Result := IsAlphabetic(Character) or IsNumeric(Character);
    122154end;
    123155
    124 function TParser.IsNumeric(Character: char): boolean;
     156function TParserASM51.IsNumeric(Character: char): boolean;
    125157begin
    126158  Result := Character in ['0'..'9'];
    127159end;
    128160
    129 function TParser.IsHex(Character: char): boolean;
    130 begin
    131   Result := IsNumeric(Character) or (Character in ['A'..'F']);
    132 end;
    133 
    134 function TParser.IsString(Text: string): Boolean;
     161function TParserASM51.IsHex(Character: char): boolean;
     162begin
     163  Result := IsNumeric(Character) or (Character in ['A'..'F']) or
     164    (Character in ['a'..'f']);
     165end;
     166
     167function TParserASM51.IsString(Text: string): Boolean;
    135168begin
    136169  raise Exception.Create('Not implemented');
    137170end;
    138171
    139 function TParser.IsIdentificator(Text: string): boolean;
     172function TParserASM51.IsIdentificator(Text: string): boolean;
    140173var
    141174  I: integer;
     
    154187end;
    155188
    156 function TParser.IsWhiteSpace(Character: char): boolean;
     189function TParserASM51.IsWhiteSpace(Character: char): boolean;
    157190begin
    158191  Result := (Character <= ' ');
    159192end;
    160193
    161 function TParser.Eof: Boolean;
    162 begin
    163   Result := Position > Length(Source);
    164 end;
    165 
    166 function TParser.IsKeyword(Text: string): Boolean;
     194function TParserASM51.Eof: Boolean;
     195begin
     196  Result := (Position > Length(Source)) or (Trim(Copy(Source, Position, Length(Source))) = '');
     197end;
     198
     199function TParserASM51.IsKeyword(Text: string): Boolean;
    167200var
    168201  I: integer;
     
    174207end;
    175208
    176 function TParser.IsNumber(Text: string): Boolean;
     209function TParserASM51.IsNumber(Text: string): Boolean;
    177210var
    178211  Num: Integer;
     
    181214end;
    182215
     216function TParserASM51.IsHexNumber(Text: string): Boolean;
     217var
     218  Num: Integer;
     219begin
     220  Result := TryStrToInt('$' + Text, Num);
     221end;
     222
    183223
    184224end.
Note: See TracChangeset for help on using the changeset viewer.