Changeset 25 for branches/AS8051toC/UParser.pas
- Timestamp:
- Oct 15, 2012, 12:00:21 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/AS8051toC/UParser.pas
r22 r25 17 17 TErrorEvent = procedure (Message: string) of object; 18 18 19 19 20 { TParser } 20 21 … … 23 24 FOnError: TErrorEvent; 24 25 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 25 37 Source: string; 26 38 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; 31 42 function ReadChar: Char; 32 43 function NextChar: Char; … … 39 50 function IsKeyword(Text: string): Boolean; 40 51 function IsNumber(Text: string): Boolean; 52 function IsHexNumber(Text: string): Boolean; 41 53 function IsString(Text: string): Boolean; 42 54 function IsWhiteSpace(Character: char): boolean; 43 55 function Eof: Boolean; 44 property OnError: TErrorEvent read FOnError write FOnError; 56 end; 57 58 TParserMacro = class 59 45 60 end; 46 61 … … 48 63 implementation 49 64 50 { TParser }51 52 65 procedure TParser.Error(Text: string); 53 66 begin … … 56 69 57 70 function TParser.Expect(Text: string): Boolean; 71 begin 72 73 end; 74 75 function TParser.GetNext(ChangePos: Boolean): string; 76 begin 77 78 end; 79 80 function TParser.ReadNext: string; 81 begin 82 83 end; 84 85 { TParserASM51 } 86 87 function TParserASM51.Expect(Text: string): Boolean; 58 88 var 59 89 NextToken: string; … … 64 94 end; 65 95 66 function TParser .GetNext(ChangePos: Boolean = False): string;96 function TParserASM51.GetNext(ChangePos: Boolean = False): string; 67 97 var 68 98 OldPosition: Integer; … … 77 107 end; 78 108 end else 79 if Is Numeric(NextChar) then begin109 if IsHex(NextChar) then begin 80 110 Result := ReadChar; 81 while Is Numeric(NextChar) do begin111 while IsHex(NextChar) do begin 82 112 Result := Result + ReadChar; 83 113 end; 114 if NextChar = 'h' then Result := Result + ReadChar; 115 // else 84 116 end else Result := ReadChar; 85 117 if not ChangePos then Position := OldPosition; 86 118 end; 87 119 88 function TParser .ReadNext: string;120 function TParserASM51.ReadNext: string; 89 121 begin 90 122 Result := GetNext(True); 91 123 end; 92 124 93 function TParser .ReadChar: Char;125 function TParserASM51.ReadChar: Char; 94 126 begin 95 127 Result := NextChar; … … 97 129 end; 98 130 99 function TParser .NextChar: Char;131 function TParserASM51.NextChar: Char; 100 132 begin 101 133 Result := Source[Position]; 102 134 end; 103 135 104 function TParser .ReadEol: string;136 function TParserASM51.ReadEol: string; 105 137 begin 106 138 Result := ''; … … 112 144 end; 113 145 114 function TParser .IsAlphabetic(Character: char): boolean;146 function TParserASM51.IsAlphabetic(Character: char): boolean; 115 147 begin 116 148 Result := (Character in ['a'..'z']) or (Character in ['A'..'Z']); 117 149 end; 118 150 119 function TParser .IsAlphanumeric(Character: char): boolean;151 function TParserASM51.IsAlphanumeric(Character: char): boolean; 120 152 begin 121 153 Result := IsAlphabetic(Character) or IsNumeric(Character); 122 154 end; 123 155 124 function TParser .IsNumeric(Character: char): boolean;156 function TParserASM51.IsNumeric(Character: char): boolean; 125 157 begin 126 158 Result := Character in ['0'..'9']; 127 159 end; 128 160 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; 161 function TParserASM51.IsHex(Character: char): boolean; 162 begin 163 Result := IsNumeric(Character) or (Character in ['A'..'F']) or 164 (Character in ['a'..'f']); 165 end; 166 167 function TParserASM51.IsString(Text: string): Boolean; 135 168 begin 136 169 raise Exception.Create('Not implemented'); 137 170 end; 138 171 139 function TParser .IsIdentificator(Text: string): boolean;172 function TParserASM51.IsIdentificator(Text: string): boolean; 140 173 var 141 174 I: integer; … … 154 187 end; 155 188 156 function TParser .IsWhiteSpace(Character: char): boolean;189 function TParserASM51.IsWhiteSpace(Character: char): boolean; 157 190 begin 158 191 Result := (Character <= ' '); 159 192 end; 160 193 161 function TParser .Eof: Boolean;162 begin 163 Result := Position > Length(Source);164 end; 165 166 function TParser .IsKeyword(Text: string): Boolean;194 function TParserASM51.Eof: Boolean; 195 begin 196 Result := (Position > Length(Source)) or (Trim(Copy(Source, Position, Length(Source))) = ''); 197 end; 198 199 function TParserASM51.IsKeyword(Text: string): Boolean; 167 200 var 168 201 I: integer; … … 174 207 end; 175 208 176 function TParser .IsNumber(Text: string): Boolean;209 function TParserASM51.IsNumber(Text: string): Boolean; 177 210 var 178 211 Num: Integer; … … 181 214 end; 182 215 216 function TParserASM51.IsHexNumber(Text: string): Boolean; 217 var 218 Num: Integer; 219 begin 220 Result := TryStrToInt('$' + Text, Num); 221 end; 222 183 223 184 224 end.
Note:
See TracChangeset
for help on using the changeset viewer.