Basic MGL script.
MGL code:
title 'MGL parser sample' # call function call 'sample' # ordinary for-loop for $0 -1 1 0.1 if $0<0:line 0 0 1 $0 'r':else:line 0 0 1 $0 'g':endif next # if-elseif-else for $i -1 1 0.5 if $i<0 text 1.1 $i '$i' 'b' elseif $i>0 text 1.1 $i '$i' 'r' else text 1.1 $i '$i' endif next # ordinary do-while do defnum $i $i-0.2 line 0 0 $i 1 'b' while $i>0 # do-next-break do defnum $i $i-0.2 if $i<-1 then break line 0 0 $i 1 'm' next # for-while-continue for $i -5 10 text $i/5 1.1 'a'+($i+5) if $i<0 text $i/5-0.06 1.1 '--' 'b' elseif mod($i,2)=0 text $i/5-0.06 1.1 '~' 'r' else # NOTE: 'continue' bypass the 'while'! continue endif # NOTE: 'while' limit the actual number of iterations while $i<5 # nested loops for $i 0 1 0.1 for $j 0 1 0.1 ball $i $j if $j>0.5 then continue ball $i $j 'b+' next next func 'sample' new dat 100 'sin(2*pi*(i/99+1))' plot dat;xrange -1 0 box:axis xlabel 'x':ylabel 'y' return
C++ code:
void smgl_parser(mglGraph *gr) // example of MGL parsing { // NOTE: MGL version show much more variants of loops and conditions. gr->Title("MGL parser sample"); double a[100]; // let a_i = sin(4*pi*x), x=0...1 for(int i=0;i<100;i++)a[i]=sin(2*M_PI*i/99); mglParse *parser = new mglParse; // Add MGL variable and set yours data to it. mglData *d = dynamic_cast<mglData*>(parser->AddVar("dat")); if(d) d->Set(a,100); parser->Execute(gr, "plot dat; xrange -1 0\nbox\naxis"); // You may break script at any line do something // and continue after that. parser->Execute(gr, "xlabel 'x'\nylabel 'y'\nbox"); // Also you may use cycles or conditions in script. parser->Execute(gr, "for $0 -1 1 0.1\nif $0<0\n" "line 0 0 1 $0 'r':else:line 0 0 1 $0 'g'\n" "endif\nnext"); // You may use for or do-while loops as C/C++ one double i=1; do { char buf[64]; sprintf(buf,"line 0 0 %g 1 'b'",i); parser->Execute(gr, buf); i=i-0.2; } while(i>0); // or as MGL one. parser->Execute(gr, "for $i -1 1 0.5\n" "if $i<0\ntext 1.1 $i '$i' 'b'\n" "elseif $i>0\ntext 1.1 $i '$i' 'r'\n" "else\ntext 1.1 $i '$i'\nendif\nnext\n"); // There are 'break' and 'continue' commands in MGL too. // NOTE: 'next' act as "while(1)" in do-while loops. parser->Execute(gr, "do\ndefnum $i $i-0.2\n" "if $i<-1 then break\nline 0 0 $i 1 'm'\nnext\n"); // One issue with 'continue' -- it bypass 'while' checking parser->Execute(gr, "for $i -5 10\ntext $i/5 1.1 'a'+($i+5)\nif $i<0\n" "text $i/5-0.06 1.1 '--' 'b'\n" "elseif mod($i,2)=0\ntext $i/5-0.06 1.1 '~' 'r'\n" "else\ncontinue\nendif\n" // NOTE: 'while' limit the actual number of iterations in for-loop. "while $i<5\n"); // Finally, MGL support nested loops too. parser->Execute(gr, "for $i 0 1 0.1\nfor $j 0 1 0.1\nball $i $j\n" "if $j>0.5 then continue\nball $i $j 'b+'\nnext\nnext\n"); // Clean up memory. delete parser; }