JsonParserByLeo/Test/JPath.mq5
2026-09-03 11:13:49 -05:00

120 lines
4.7 KiB
MQL5

//+------------------------------------------------------------------+
//| JPath.mq5 |
//| Copyright 2026, Niquel Mendoza |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Niquel Mendoza"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "..\\Src\\Json.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void JsonPathSize(TSN::CSLDomQueryVm* state)
{
TSN::CDomNodeBase* ptr = state.FReadNode(0);
state.FPushInteger(ptr.Size());
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
const string json = "{\n"
"\"libros\":{\n"
"\"libro1\": {\"valor\":542,\"sumando\":[],\"comando\":30},\n"
"\"libro2\": {\"valor\":19,\"sumando\":[30],\"comando\":2},\n"
"\"libro3\": {\"valor\":452,\"sumando\":[20,50,65,89,419],\"comando\":7}\n"
" }\n"
"}";
//---
TSN::CJsonParser parser;
parser.Assing(json);
parser.CorrectPadding();
parser.Parse();
//---
TSN::CDomNodeManager manager;
TSN::CDomNodeBase node(&manager);
parser.GetRoot().ToDom(&node, &manager);
//---
TSN::CSLDomQueryVm vm;
vm.SetFunction("size", JsonPathSize);
// $.libros[?(@.comando * 20 < @.valor && @.sumando.size()].sumando[*]
const string asm =
"%reg 0 = 20 \n"
"%reg 1 = 1\n"
"INS_ACCESO_KEY_F K\"libros\"\n"
"INS_INICIAR_ITERACION 1 ; Solo se permiten objetos en esta iteracion\n"
"@Iteracion: ; Jump aqui\n"
" INS_ITER_ASSING 'Final' ; En caso falle salta a Final y terminamos .. \n"
" INS_ACCESO_KEY 'Iteracion' K\"comando\" ; Accedemos a comando \n"
" INS_SAVE 256 'Iteracion' ; Lo guardamos en el registro 256 si falla reset\n"
" INS_M_MUL 256 0 256 'Iteracion' ; Mulñtiplicamos el registro 256 por el 0 y lo guardamos en 256\n"
" INS_ACCESO_KEY 'Iteracion' K\"valor\" ; Accede a valor\n"
" INS_SAVE 257 'Iteracion'; Guardamos su valor actual\n"
" INS_COMPARE_MENOR 256 257 1 'Iteracion' ; Comparamos registros\n"
" INS_ACCESO_KEY 'Iteracion' K\"sumando\" ; Accedemos a sumando \n"
" INS_SAVE_NO_RESET 256 'Iteracion'; guadcamos en sumand\n"
// Nota que aqui el resultado se pondra apartir del 258 reg dado qeu el 257 se pone auto
// el numero de parametros escritos...
" INS_CALL 256 1 'size'; LLamamos a la funcino size y sus parametros emppizan en 256 y tiene 1 parametro a leer\n"
// Nota que esta verirficacion quizas no haga falta.. aunque si esperamos exactamentwe N parameotrs
// o digamos 1 quizas si si no se nos desalinea... nuestra lecutra.. auqnue quizas nos podemos saltar a cierta
// direccion daod que sabemos que tenemos n parmaeotrs en el reg 257
// A futuro si veo que se requiere separar o casos mas complejos como iterar sobre los parametros obtenidos
// ahi si si usariosm offsets... ahi quizas lo agrego no es complejo es cosa de cambiar layort y nueva sintaxis de asm
// pero ya eso creo que tiraraimso ya a una vm casi de un lenguaje solo faltura stack frames y ya por que en teoria
// ahora mismo podemos tener varaibles, bucles, con los ifs, etc...
" INS_COMPARE_EQ 257 1 1 'Iteracion' ; Verificamos que el numero de retornanos es 1\n"
" INS_COMPARE_IS 258 'Iteracion' 1 ; Usamos is para comprar su valor\n"
" ; Si llegamos hasta aqui pasamos todo entonces copy all\n"
" INS_COPY_ALL 'Iteracion' \n"
" INS_JUMP 'Iteracion'; Ahora nos dirigimos devuelva a iteracion \n"
"@Final: \n"
" INS_SALIDA ; salimos"
;
//---
vm.Assing(asm);
vm.CorrectPadding();
vm.CompileAsm();
vm.LockValues();
vm.BaseNode(&node);
//---
vm.Summary();
//---
TSN::CDomNodeBase* elements[];
vm.Run(elements);
//---
const int t = vm.m_el_s;
for(int i = 0; i < t; i++)
{
Print(elements[i].ToInt(0));
}
//---
/*
JPath (EURUSD,M1) 20
JPath (EURUSD,M1) 50
JPath (EURUSD,M1) 65
JPath (EURUSD,M1) 89
JPath (EURUSD,M1) 419
*/
}
//+------------------------------------------------------------------+