Ignore:
Timestamp:
Oct 18, 2010, 8:53:48 AM (14 years ago)
Author:
george
Message:

Added: Base parsing of class, pointer and enumeration.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/Transpascal/Compiler/Analyze/UParser.pas

    r64 r65  
    3535    procedure GetNextToken;
    3636    function ReadCode: string;
     37    function NextToken: string;
    3738    procedure Expect(Code: string);
    3839    function IsWhiteSpace(Character: char): boolean;
     
    345346  GetNextToken;
    346347  Log('Read: ' + Result);
     348end;
     349
     350function TBaseParser.NextToken: string;
     351begin
     352  Result := FNextToken;
    347353end;
    348354
     
    10641070      Expect(AssignSymbol);
    10651071    end;
    1066     if FNextToken = 'record' then begin
     1072    if NextToken = '(' then begin
     1073      // Enumeration
     1074      Expect('(');
     1075      Result := TTypeEnumeration.Create;
     1076      TTypeEnumeration(Result).Parent := TypeList;
     1077      TTypeEnumeration(Result).Name := Name;
     1078      with TTypeEnumeration(Result) do
     1079      with TEnumItem(Items[Items.Add(TEnumItem.Create)]) do begin
     1080        Name := ReadCode;
     1081        if (NextToken = '=') and (FNextTokenType = ttConstantNumber) then begin
     1082          Expect('=');
     1083          Index := StrToInt(ReadCode);
     1084        end;
     1085      end;
     1086      while (NextToken = ',') and (FNextTokenType <> ttEndOfFile) do
     1087      begin
     1088        Expect(',');
     1089        with TTypeEnumeration(Result) do
     1090        with TEnumItem(Items[Items.Add(TEnumItem.Create)]) do begin
     1091          Name := ReadCode;
     1092          if (NextToken = '=') and (FNextTokenType = ttConstantNumber) then begin
     1093            Expect('=');
     1094            Index := StrToInt(ReadCode);
     1095          end;
     1096        end;
     1097      end;
     1098      Expect(')');
     1099    end else
     1100    if NextToken = 'record' then begin
    10671101      Expect('record');
    10681102      Result := TTypeRecord.Create;
    10691103      TTypeRecord(Result).Parent := TypeList;
    10701104      TType(Result).Name := Name;
    1071       while (FNextToken <> 'end') and (FNextTokenType <> ttEndOfFile) do
     1105      while (NextToken <> 'end') and (FNextTokenType <> ttEndOfFile) do
    10721106      begin
    10731107        TTypeRecord(Result).Items.Add(ParseType(TypeList, True, ':'));
     
    10761110      Expect('end');
    10771111    end else
    1078     if FNextToken = 'array' then begin
     1112    if NextToken = 'class' then begin
     1113      Expect('class');
     1114      Result := TTypeClass.Create;
     1115      TTypeClass(Result).Parent := TypeList;
     1116      TTypeClass(Result).Name := Name;
     1117      if NextToken <> ';' then begin
     1118        while (NextToken <> 'end') and (FNextTokenType <> ttEndOfFile) do
     1119        begin
     1120          TTypeClass(Result).Items.Add(ParseType(TypeList, True, ':'));
     1121          Expect(';');
     1122        end;
     1123        Expect('end');
     1124      end;
     1125    end else
     1126    if NextToken = 'array' then begin
    10791127      Expect('array');
    10801128      Result := TTypeArray.Create;
    10811129      TTypeArray(Result).Parent := TypeList;
    10821130      TType(Result).Name := Name;
    1083       if FNextToken = '[' then begin
     1131      if NextToken = '[' then begin
    10841132        Expect('[');
    10851133        TypeName := FNextToken;
     
    10941142      if not Assigned(TTypeArray(Result).ItemType) then
    10951143        ErrorMessage(SUndefinedType, [TypeName]);
     1144    end else
     1145    if NextToken = '^' then begin
     1146      Expect('^');
     1147      Result := TTypePointer.Create;
     1148      TTypePointer(Result).Parent := TypeList;
     1149      TTypePointer(Result).Name := Name;
     1150      TTypePointer(Result).UsedType := ParseType(TypeList, False);
     1151    end else
     1152    if NextToken = 'type' then begin
     1153      Expect('type');
     1154      Result := TTypeInherited.Create;
     1155      TTypeInherited(Result).Parent := TypeList;
     1156      TTypeInherited(Result).Name := Name;
     1157      if NextToken = '(' then begin
     1158        Expect('(');
     1159        TTypeInherited(Result).UsedType := ParseType(TypeList, False);
     1160        Expect(')');
     1161      end else TTypeInherited(Result).UsedType := nil;
    10961162    end else begin
    10971163      TypeName := ReadCode;
    1098       if TypeName = 'internal' then begin
    1099         Result := TType.Create;
    1100         TType(Result).Parent := TypeList;
    1101         TType(Result).Name := Name;
    1102         TType(Result).UsedType := nil;
    1103       end else
    11041164      if ExpectName then begin
    11051165        Result := TType.Create;
Note: See TracChangeset for help on using the changeset viewer.