Changeset 25


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.
Location:
branches/AS8051toC
Files:
10 added
5 edited

Legend:

Unmodified
Added
Removed
  • branches/AS8051toC/AS8051toC.lpi

    r22 r25  
    3030      </local>
    3131    </RunParams>
    32     <RequiredPackages Count="2">
     32    <RequiredPackages Count="3">
    3333      <Item1>
    34         <PackageName Value="SynEdit"/>
     34        <PackageName Value="TemplateGenerics"/>
     35        <DefaultFilename Value="Packages\TemplateGenerics\TemplateGenerics.lpk" Prefer="True"/>
    3536      </Item1>
    3637      <Item2>
     38        <PackageName Value="SynEdit"/>
     39      </Item2>
     40      <Item3>
    3741        <PackageName Value="LCL"/>
    38       </Item2>
     42      </Item3>
    3943    </RequiredPackages>
    40     <Units Count="4">
     44    <Units Count="6">
    4145      <Unit0>
    4246        <Filename Value="AS8051toC.lpr"/>
     
    6266        <UnitName Value="UParser"/>
    6367      </Unit3>
     68      <Unit4>
     69        <Filename Value="USource.pas"/>
     70        <IsPartOfProject Value="True"/>
     71        <UnitName Value="USource"/>
     72      </Unit4>
     73      <Unit5>
     74        <Filename Value="UCompiler.pas"/>
     75        <IsPartOfProject Value="True"/>
     76        <UnitName Value="UCompiler"/>
     77      </Unit5>
    6478    </Units>
    6579  </ProjectOptions>
     
    7589      <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
    7690    </SearchPaths>
     91    <Parsing>
     92      <SyntaxOptions>
     93        <SyntaxMode Value="Delphi"/>
     94      </SyntaxOptions>
     95    </Parsing>
    7796    <Linking>
    7897      <Options>
  • branches/AS8051toC/AS8051toC.lpr

    r22 r25  
    88  {$ENDIF}{$ENDIF}
    99  Interfaces, // this includes the LCL widgetset
    10   Forms, UMainForm, UFindFile, UParser
     10  Forms, UMainForm, UFindFile, UParser, USource, TemplateGenerics, UCompiler
    1111  { you can add units after this };
    1212
  • branches/AS8051toC/UMainForm.lfm

    r22 r25  
    11object FormMain: TFormMain
    2   Left = 266
     2  Left = 226
    33  Height = 553
    4   Top = 90
     4  Top = 110
    55  Width = 702
    66  Caption = 'AS8051 to C converter'
     
    1010  OnDestroy = FormDestroy
    1111  OnShow = FormShow
    12   LCLVersion = '1.1'
     12  LCLVersion = '1.0.1.3'
    1313  WindowState = wsMaximized
    1414  object EditPath: TEdit
     
    1919    Anchors = [akTop, akLeft, akRight]
    2020    TabOrder = 0
    21     Text = 'h:\Projekty\E341\Repository\trunk'
     21    Text = 'Test\Test.a51'
    2222  end
    2323  object ButtonConvert: TButton
    24     Left = 7
     24    Left = 8
    2525    Height = 25
    26     Top = 34
     26    Top = 32
    2727    Width = 75
    2828    Caption = 'Convert'
     
    533533    top = 168
    534534  end
     535  object OpenDialog1: TOpenDialog
     536    DefaultExt = '.a51;.asm'
     537    left = 379
     538    top = 168
     539  end
    535540end
  • branches/AS8051toC/UMainForm.pas

    r23 r25  
    1717    ButtonConvert: TButton;
    1818    EditPath: TEdit;
     19    OpenDialog1: TOpenDialog;
    1920    SynCppSyn1: TSynCppSyn;
    2021    SynMemo1: TSynMemo;
     
    2627    procedure FormShow(Sender: TObject);
    2728  private
    28     Parser: TParser;
     29    Parser: TParserASM51;
    2930  public
    3031    MainFile: TStringList;
     
    3233    Output: string;
    3334    Macros: TStringList;
     35    function IsHexNumber(Text: string): Boolean;
     36    function CheckInstructionParameter: Boolean;
    3437    procedure Emit(Text: string);
    3538    procedure Error(Text: string);
     
    6669
    6770procedure TFormMain.ButtonConvertClick(Sender: TObject);
    68 var
    69   Path: string;
    70 begin
    71   Path := 'h:\Projekty\E341\Repository\trunk';
    72   MainFile.LoadFromFile(Path + DirectorySeparator + 'main.a51');
     71begin
     72  MainFile.LoadFromFile(EditPath.Text);
    7373  Parser.Source := LowerCase(MainFile.Text);
    7474  Parser.Position := 1;
     
    7676  Parse;
    7777  MainFileOut.Text := Output;
    78   ForceDirectoriesUTF8(Path + DirectorySeparator + 'C');
    79   MainFileOut.SaveToFile(Path + DirectorySeparator + 'C' +
     78  ForceDirectoriesUTF8(ExtractFileDir(EditPath.Text) + DirectorySeparator + 'C');
     79  MainFileOut.SaveToFile(ExtractFileDir(EditPath.Text) + DirectorySeparator + 'C' +
    8080    DirectorySeparator + 'main.c');
    8181  SynMemo1.Lines.Assign(MainFileOut);
     
    8686  Dir: string;
    8787begin
    88   if SelectDirectory('Výběr adresáře', EditPath.Text, Dir) then
    89     EditPath.Text := Dir;
     88  OpenDialog1.FileName := EditPath.Text;
     89  if OpenDialog1.Execute then begin
     90    EditPath.Text := OpenDialog1.FileName;
     91  end;
    9092end;
    9193
    9294procedure TFormMain.FormCreate(Sender: TObject);
    9395begin
    94   Parser := TParser.Create;
     96  Parser := TParserASM51.Create;
    9597  Parser.OnError := Error;
    9698  MainFile := TStringList.Create;
     
    111113  ButtonConvertClick(Self);
    112114  //Close;
     115end;
     116
     117function TFormMain.IsHexNumber(Text: string): Boolean;
     118begin
     119  Result := (LowerCase(Copy(Text, Length(Text), 1)) = 'h') and
     120    (Parser.IsHexNumber(Copy(Text, 1, Length(Text) - 1)));
     121end;
     122
     123function TFormMain.CheckInstructionParameter: Boolean;
     124begin
     125  Text := Parser.GetNext;
     126  Result := False;
     127  if Parser.IsNumber(Text) then Result := True
     128  else if Text = '#' then begin
     129    Result := True;
     130    Parser.Expect('#');
     131    if IsHexNumber(Parser.GetNext) then Emit(Parser.ReadNext)
     132    else if Parser.IsNumber(Parser.GetNext) then Emit(Parser.ReadNext)
     133    else Error('Invalid parameter');
     134  end
     135  else if Copy(Text, 1, 1) = '@' then begin
     136    if IsHexNumber(Copy(Text, 2, Length(Text))) then Result := True;
     137    Emit(Parser.ReadNext);
     138  end;
    113139end;
    114140
     
    176202    end
    177203    else if ParseComment then
    178     else if ParseMacro then
    179204    else if ParseKeywords then
    180205    else if ParseInstruction then
     
    200225      end else Error('Unexpected token "' + Variable + '"');
    201226    end
     227    else if ParseMacro then
     228    else if ParseMacroUsage then
    202229    else Error('Unexpected token "' + GetNext + '"');
    203230    Emit(LineEnding);
     
    208235var
    209236  MacroName: string;
    210 begin
    211   with Parser do begin
     237  OldPos: Integer;
     238begin
     239  with Parser do begin
     240    OldPos := Position;
    212241    if GetNext = '%' then begin
    213242      Result := True;
     
    269298          Expect('(');
    270299        end;
    271       end;// else Error('Unknown macro: ' + ReadNext);
     300      end else begin
     301        Position := OldPos;
     302        Result := False;
     303      end;
    272304    end else Result := False;
    273305  end;
     
    299331        Expect('(');
    300332        Emit('(');
    301         if ParseMacroUsage then
    302           else Emit(ReadNext);
     333        ParseDbExpression;
     334        //else Emit(ReadNext);
    303335        while GetNext = ',' do begin
    304336          Expect(',');
    305337          Emit(',');
    306           if ParseMacroUsage then
    307             else Emit(ReadNext);
     338          ParseDbExpression;
     339          //if ParseMacroUsage then
     340          //else if GetNext <> ')' then Emit(ReadNext);
    308341        end;
    309342        Emit(')');
     
    339372        ReadNext;
    340373      end;
     374    end else
     375    if GetNext = 'using' then begin
     376      Result := True;
     377      Expect('using');
     378      Value := ReadNext;
     379      Emit('// using reg bank ' + Value);
    341380    end else
    342381    if GetNext = 'cseg' then begin
     
    411450      Emit(';');
    412451    end else
     452    if GetNext = 'mov' then begin
     453      Expect('mov');
     454      Result := True;
     455      Emit('MOV(');
     456      ParseDbExpression;
     457      Expect(',');
     458      Emit(',');
     459      ParseDbExpression;
     460      Emit(');');
     461    end else
    413462    if GetNext = 'reti' then begin
    414463      Result := True;
     
    457506        Emit('&& ');
    458507      end else
    459       Error('Unknown operand "' + ReadNext + '"');
     508        Error('Unknown operand "' + ReadNext + '"');
    460509      if ParseMacroUsage then
    461510      else if IsNumber(GetNext) then Emit(ReadNext)
     
    482531    end
    483532    else if GetNext = '''' then Emit('"' + ParseString + '"')
    484     else if IsNumber(GetNext) then Emit(ReadNext)
    485     else if IsIdentificator(GetNext) then Emit(ReadNext)
    486     else Error('Unknown IF parameter "' + GetNext + '"');
     533    else if CheckInstructionParameter then
     534    else if IsIdentificator(GetNext) then begin
     535      Emit(ReadNext);
     536      if ParseMacroUsage then ;
     537    end else Error('Unknown IF parameter "' + GetNext + '"');
    487538
    488539    if GetNext = '+' then begin
     
    504555      Expect('/');
    505556      Emit('/');
     557      ParseDbExpression;
     558    end else
     559    if GetNext = 'shl' then begin
     560      Expect('shl');
     561      Emit('<< ');
     562      ParseDbExpression;
     563    end else
     564    if GetNext = 'shr' then begin
     565      Expect('shr');
     566      Emit('>> ');
    506567      ParseDbExpression;
    507568    end else
  • 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.