|
@@ -20,7 +20,7 @@ const
|
|
'uknown', 'error',
|
|
'uknown', 'error',
|
|
'index',
|
|
'index',
|
|
'string', 'number', '(', ')',
|
|
'string', 'number', '(', ')',
|
|
- 'linksymbol',
|
|
|
|
|
|
+ 'assembler symbol',
|
|
|
|
|
|
'instruction',
|
|
'instruction',
|
|
'func',
|
|
'func',
|
|
@@ -49,6 +49,20 @@ type
|
|
constructor Create(const amsg: string; aofs: integer);
|
|
constructor Create(const amsg: string; aofs: integer);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ TAsmSym = record
|
|
|
|
+ name : string;
|
|
|
|
+ value : string;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ { TAsmSymList }
|
|
|
|
+
|
|
|
|
+ TAsmSymList = class(TObject)
|
|
|
|
+ syms : array of TAsmSym;
|
|
|
|
+ count : integer;
|
|
|
|
+ procedure Push(const AName, AValue: string);
|
|
|
|
+ procedure Clear;
|
|
|
|
+ end;
|
|
|
|
+
|
|
const
|
|
const
|
|
WAT_DEFTYPES='iN or fN';
|
|
WAT_DEFTYPES='iN or fN';
|
|
|
|
|
|
@@ -296,27 +310,46 @@ begin
|
|
ConsumeToken(sc, weCloseBrace);
|
|
ConsumeToken(sc, weCloseBrace);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure ConsumeAsmSym(sc: TWatScanner; dst: TAsmSymList);
|
|
|
|
+begin
|
|
|
|
+ dst.Push(sc.asmCmd, sc.resText);
|
|
|
|
+ sc.Next;
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure ParseModuleInt(sc: TWatScanner; dst: TWasmModule);
|
|
procedure ParseModuleInt(sc: TWatScanner; dst: TWasmModule);
|
|
var
|
|
var
|
|
tk : TWatToken;
|
|
tk : TWatToken;
|
|
|
|
+ symlist : TAsmSymList;
|
|
begin
|
|
begin
|
|
if not ConsumeOpenToken(sc, weModule) then
|
|
if not ConsumeOpenToken(sc, weModule) then
|
|
ErrorExpectButFound(sc, 'module');
|
|
ErrorExpectButFound(sc, 'module');
|
|
|
|
|
|
- sc.Next;
|
|
|
|
- ConsumeAnyOpenToken(sc, tk);
|
|
|
|
- while tk <> weCloseBrace do begin
|
|
|
|
- case tk of
|
|
|
|
- weFunc:
|
|
|
|
- ParseFunc(sc, dst.AddFunc);
|
|
|
|
- weExport:
|
|
|
|
- ParseExport(sc, dst.AddExport);
|
|
|
|
- else
|
|
|
|
- ErrorExpectButFound(sc, 'func', TokenStr[sc.token]);
|
|
|
|
- end;
|
|
|
|
|
|
+ symlist := TAsmSymList.Create;
|
|
|
|
+ try
|
|
|
|
+ sc.Next;
|
|
ConsumeAnyOpenToken(sc, tk);
|
|
ConsumeAnyOpenToken(sc, tk);
|
|
|
|
+ while tk <> weCloseBrace do begin
|
|
|
|
+ case tk of
|
|
|
|
+ weAsmSymbol:
|
|
|
|
+ ConsumeAsmSym(sc, symlist);
|
|
|
|
+ weFunc: begin
|
|
|
|
+ ParseFunc(sc, dst.AddFunc);
|
|
|
|
+ symlist.Clear;
|
|
|
|
+ end;
|
|
|
|
+ weExport:
|
|
|
|
+ begin
|
|
|
|
+ ParseExport(sc, dst.AddExport);
|
|
|
|
+ symlist.Clear;
|
|
|
|
+ end;
|
|
|
|
+ else
|
|
|
|
+ ErrorExpectButFound(sc, 'func', TokenStr[sc.token]);
|
|
|
|
+ end;
|
|
|
|
+ ConsumeAnyOpenToken(sc, tk);
|
|
|
|
+ end;
|
|
|
|
+ ConsumeToken(sc, weCloseBrace);
|
|
|
|
+ finally
|
|
|
|
+ symlist.Free;
|
|
end;
|
|
end;
|
|
- ConsumeToken(sc, weCloseBrace);
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
function ParseModule(sc: TWatScanner; dst: TWasmModule; var errMsg: string): Boolean;
|
|
function ParseModule(sc: TWatScanner; dst: TWasmModule; var errMsg: string): Boolean;
|
|
@@ -369,6 +402,32 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{ TAsmSymList }
|
|
|
|
+
|
|
|
|
+procedure TAsmSymList.Push(const AName, AValue: string);
|
|
|
|
+var
|
|
|
|
+ i : integer;
|
|
|
|
+begin
|
|
|
|
+ for i:=0 to count-1 do
|
|
|
|
+ if syms[i].name = Aname then begin
|
|
|
|
+ syms[i].value := AValue;
|
|
|
|
+ Exit;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ if count=length(syms) then begin
|
|
|
|
+ if count=0 then SetLength(syms, 4)
|
|
|
|
+ else SetLength(syms, count*2);
|
|
|
|
+ end;
|
|
|
|
+ syms[count].name:=AName;
|
|
|
|
+ syms[count].value:=Avalue;
|
|
|
|
+ inc(count);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TAsmSymList.Clear;
|
|
|
|
+begin
|
|
|
|
+ count:=0;
|
|
|
|
+end;
|
|
|
|
+
|
|
{ EParserError }
|
|
{ EParserError }
|
|
|
|
|
|
constructor EParserError.Create(const amsg: string; aofs: integer);
|
|
constructor EParserError.Create(const amsg: string; aofs: integer);
|