Tuples
This commit is contained in:
+23
-17
@@ -437,8 +437,8 @@ begin
|
||||
items.Add(ParseExpression.Node);
|
||||
end;
|
||||
|
||||
var id := TIdentities.List('[', ']', ' ', startLoc);
|
||||
Result := TArgumentList.Create(items.ToArray, id);
|
||||
// CHANGED: Use Tuple factory instead of ArgumentList
|
||||
Result := TAst.Tuple(items.ToArray, startLoc);
|
||||
finally
|
||||
items.Free;
|
||||
end;
|
||||
@@ -447,15 +447,19 @@ end;
|
||||
|
||||
function TParser.ExtractIdentifiers(const Node: IAstNode; const Context: string): TArray<IIdentifierNode>;
|
||||
var
|
||||
list: IArgumentList;
|
||||
list: TArray<IAstNode>;
|
||||
i: Integer;
|
||||
begin
|
||||
if Node.Kind <> akArgumentList then
|
||||
// Support both Tuple (new syntax [...]) and ArgumentList (internal legacy)
|
||||
if Node.Kind = akTuple then
|
||||
list := Node.AsTuple.Elements
|
||||
else if Node.Kind = akArgumentList then
|
||||
list := Node.AsArgumentList.ToArray
|
||||
else
|
||||
ErrorFmt('%s expects a vector [...]', [Context]);
|
||||
|
||||
list := Node.AsArgumentList;
|
||||
SetLength(Result, list.Count);
|
||||
for i := 0 to list.Count - 1 do
|
||||
SetLength(Result, Length(list));
|
||||
for i := 0 to High(list) do
|
||||
begin
|
||||
if list[i].Kind <> akIdentifier then
|
||||
ErrorFmt('%s vector must contain only identifiers.', [Context]);
|
||||
@@ -536,16 +540,18 @@ begin
|
||||
if Length(tailNodes) <> 2 then
|
||||
Error('Syntax Error: ''pipe'' requires [inputs] vector and (fn) transformation.');
|
||||
|
||||
if tailNodes[0].Kind <> akArgumentList then
|
||||
// Input vector is now a TupleNode
|
||||
if tailNodes[0].Kind <> akTuple then
|
||||
Error('Syntax Error: ''pipe'' first argument must be a vector [...].');
|
||||
var rawInputs := tailNodes[0].AsArgumentList;
|
||||
if (rawInputs.Count mod 2) <> 0 then
|
||||
|
||||
var rawInputs := tailNodes[0].AsTuple.Elements;
|
||||
if (Length(rawInputs) mod 2) <> 0 then
|
||||
Error('Syntax Error: Pipe inputs must be pairs of Identifier and Selector Vector (e.g. [btc [:Close]]).');
|
||||
|
||||
var pipeInputs := TList<IPipeInputNode>.Create;
|
||||
try
|
||||
var k := 0;
|
||||
while k < rawInputs.Count do
|
||||
while k < Length(rawInputs) do
|
||||
begin
|
||||
if rawInputs[k].Kind <> akIdentifier then
|
||||
Error('Syntax Error: Pipe input stream must be an identifier.');
|
||||
@@ -554,16 +560,16 @@ begin
|
||||
var streamId := rawInputs[k].AsIdentifier;
|
||||
var selKeywords: TArray<IKeywordNode>;
|
||||
|
||||
// Strict format: Selector must be a vector [...] containing keywords
|
||||
if selNode.Kind <> akArgumentList then
|
||||
// Strict format: Selector must be a vector [...] (TupleNode) containing keywords
|
||||
if selNode.Kind <> akTuple then
|
||||
Error('Syntax Error: Pipe selector must be a vector of keywords (e.g. [:Close :High]).');
|
||||
|
||||
var selList := selNode.AsArgumentList;
|
||||
if selList.Count = 0 then
|
||||
var selList := selNode.AsTuple.Elements;
|
||||
if Length(selList) = 0 then
|
||||
Error('Syntax Error: Selector list cannot be empty.');
|
||||
|
||||
SetLength(selKeywords, selList.Count);
|
||||
for var m := 0 to selList.Count - 1 do
|
||||
SetLength(selKeywords, Length(selList));
|
||||
for var m := 0 to High(selList) do
|
||||
begin
|
||||
if selList[m].Kind <> akKeyword then
|
||||
Error('Syntax Error: Selector vector must contain only keywords.');
|
||||
|
||||
Reference in New Issue
Block a user