Files
bds.mr.dpg/src.lib/grammar/dpglib.TokenParser.g
T
2026-01-03 18:33:48 +01:00

87 lines
2.2 KiB
Plaintext

unit dpglib.TokenParser;
uses
{
dpglib.Types;
dpglib.StringSymbol;
dpglib.TokenSymbol;
}
parser TTokenParser;
options
{
importVocab = dpglib.TokenLexer;
k = 3;
}
tokenFile [tm:ITokenManager]
:
name: ID
(tokenLine[tm])*
;
tokenLine [tm:ITokenManager]
local
{
t : IToken;
s : IToken;
v : integer;
sl: IStringSymbol;
ts: ITokenSymbol;
x : AnsiString;
}
: {
t := nil;
s := nil;
}
( s1: STRING { s := s1; }
| lab: ID { t := lab; }
ASSIGN
s2: STRING { s := s2; }
| id: ID { t := id; }
LPAREN
para: STRING
RPAREN
| id2: ID { t := id2; }
)
ASSIGN
i: INT {
v := StrToIntDef( i.TokenText, -1);
if s <> nil then
begin
ts := TStringSymbol.Create( s.TokenText);
ts.TokenType := v;
tm.Define(ts);
if t <> nil then
begin
ts := tm.TokenSymbol[s.TokenText];
ts.QueryInterface( IStringSymbol, sl);
sl.Lbl := t.TokenText;
tm.MapToTokenSymbol( t.TokenText, sl);
end;
end
else if t <> nil then
begin
x := Copy( t.TokenText, 4, Length( t.TokenText)-3);
ts := TTokenSymbol.Create( x);
ts.TokenType := v;
tm.Define( ts);
if para <> nil then
begin
ts := tm.TokenSymbol[ t.TokenText];
ts.Paraphrase := para.TokenText;
end;
end;
}
;