// ============================================================================ // This file is generated by the Delphi Parser Generator. // ---------------------------------------------------------------------------- // DPG version: 2.1.0.0r // Grammar: prgparser.g // ============================================================================ unit prgParser; interface uses Classes, dpgrtl.llkparser, dpgrtl.types, prgParserTokens, SysUtils; type // ========================================================================= // Type declarations from grammar. // ========================================================================= TprgCommand = ( cmdNone, cmdList, cmdListDSOs, cmdListJTAGs, cmdListFX2s, cmdListDSO, cmdListJTAG, cmdProgramDSO, cmdProgramJTAG, cmdProgramFX2, cmdProgramFX2Perm, cmdEepromDump, cmdEepromRead, cmdEepromWrite ); // ========================================================================= // Class TprgParser declaration // ========================================================================= TprgParser = class( TLLkParser) protected fCommand : TprgCommand; fDevice : string; fFiles : TStringList; fVerbose : string; private function GetFileCount: integer; function GetFile( Idx: integer): string; public procedure AfterConstruction; override; procedure BeforeDestruction; override; public property Command : TprgCommand read fCommand; property Verbose : string read fVerbose; property DeviceID : string read fDevice; property FileCount : integer read GetFileCount; property Files[i:integer] : string read GetFile; public // Public grammar rules procedure prg ; procedure prgfile ; end; implementation uses dpgrtl.exception, dpgrtl.token; // ============================================================================ // prg // ============================================================================ procedure TprgParser.prg; var v: IToken; x: IToken; begin fCommand := cmdNone; fVerbose := ''; fDevice := ''; if (( LA(1) in [LT_SLASH_list])) then begin match(LT_SLASH_list); fCommand := cmdList; end else if (( LA(1) in [LT_fx2])) then begin match(LT_fx2); if (( LA(1) in [TT_WS])) then begin match(TT_WS); end; if (( LA(1) in [LT_SLASH_list])) then begin match(LT_SLASH_list); fCommand := cmdListFX2s; end else if (( LA(1) in [LT_SLASH_loc])) then begin match(LT_SLASH_loc); match(TT_COLON); if (( LA(1) in [TT_INT])) then begin x := LT(1); match(TT_INT); end else if (( LA(1) in [TT_REXP])) then begin x := LT(1); match(TT_REXP); end else Raise EMismatchedToken.Create( LT(1), [TT_INT..TT_REXP], InputState.FileName); match(TT_EQ); prgfile; fCommand := cmdProgramFX2; fDevice := x.TokenText; if (( LA(1) in [LT_SLASH_perm])) then begin match(LT_SLASH_perm); fCommand := cmdProgramFX2Perm; end; end else Raise EMismatchedToken.Create( LT(1), [LT_SLASH_list,LT_SLASH_loc], InputState.FileName); end else if (( LA(1) in [LT_dso..LT_jtag])) then begin if (( LA(1) in [LT_dso])) then begin match(LT_dso); fCommand := cmdListDSOs; end else if (( LA(1) in [LT_jtag])) then begin match(LT_jtag); fCommand := cmdListJTAGs; end else Raise EMismatchedToken.Create( LT(1), [LT_dso..LT_jtag], InputState.FileName); if (( LA(1) in [TT_WS])) then begin match(TT_WS); end; if (( LA(1) in [LT_SLASH_id])) then begin match(LT_SLASH_id); match(TT_COLON); x := LT(1); match(TT_ID); fDevice := x.TokenText; if fCommand = cmdListDSOs then fCommand := cmdListDSO; if fCommand = cmdListJTAGs then fCommand := cmdListJTAG; if (( LA(1) in [TT_WS])) then begin match(TT_WS); end; end; if (( LA(1) in [LT_SLASH_list])) then begin match(LT_SLASH_list); end else if (( LA(1) in [TT_EQ])) then begin match(TT_EQ); prgfile; if fCommand = cmdListDSO then fCommand := cmdProgramDSO; if fCommand = cmdListJTAG then fCommand := cmdProgramJTAG; if (( LA(1) in [LT_SLASH_v])) then begin v := LT(1); match(LT_SLASH_v); fVerbose := '0'; end else if (( LA(1) in [LT_SLASH_v1])) then begin v := LT(1); match(LT_SLASH_v1); fVerbose := '1'; end; end else Raise EMismatchedToken.Create( LT(1), [LT_SLASH_list,TT_EQ], InputState.FileName); end else Raise EMismatchedToken.Create( LT(1), [LT_dso..LT_SLASH_list], InputState.FileName); end; // ============================================================================ // prgfile // ============================================================================ procedure TprgParser.prgfile; var x: IToken; pos : AnsiString; name : AnsiString; begin pos := '0'; name := ''; x := LT(1); match(TT_QID); name := x.TokenText; fFiles.Add(pos+'='+name); end; // ============================================================================ // After construction // ============================================================================ procedure TprgParser.AfterConstruction; begin inherited; fFiles := TStringList.Create end; // ============================================================================ // Before Destruction // ============================================================================ procedure TprgParser.BeforeDestruction; begin fFiles.Free; inherited end; // ============================================================================ // Get File Count // ============================================================================ function TprgParser.GetFileCount: integer; begin result := fFiles.Count end; // ============================================================================ // Get File // ============================================================================ function TprgParser.GetFile( Idx: integer): string; var i: integer; p: integer; begin result := ''; for i:=0 to fFiles.Count -1 do begin p := StrToIntDef( fFiles.Names[i], -1); if p = Idx then begin result := fFiles.ValueFromIndex[i]; break; end end; end; end.