Files
bds.fx2.prgc/src.prgc/grammar/prgParser.pas
T
2026-01-03 18:57:08 +01:00

281 lines
7.0 KiB
ObjectPascal

// ============================================================================
// 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.