query: { $stack->push(); $global->set("alias",0) } SELECT * from join { $stack->pop(undef) } ; join: { $stack->push() } table_or_join { $stack->set("left",$stack->get("result")); } LEFT JOIN table_or_join ON { $prng->arrayElement($stack->get("left")).".`int_key` = ".$prng->arrayElement($stack->get("result")).".`int_key`" } { $stack->pop([keys %{{map {$_=>1} (@{$stack->get("left")},@{$stack->get("result")})}}]) } ; table_or_join: table | table | join ; table: { $stack->push() } tab AS { my $x = $global->get("alias"); $global->set("alias",$x+1); $stack->pop(["alias$x"]); "alias$x" } ; tab: A | B | AA | BB ;