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/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
Note: See TracChangeset for help on using the changeset viewer.