Yesterday I released a piece of code the includes a parser, a rewriter and serializer for a small expression language.
The code is an example how you can parse source code and build a tree, rewrite the tree using two expressions and serialize the tree back to a piece of ‘code’.
The idea that I used here was to improve the language by adding a way to
specify structural variables. The variables start with a colon :
, but are
otherwise like variables.
The actual source code shouldn’t contain these structural variables. You should
only use them in the transformation specification. I wrote a function
replace(source, from, to)
that find and replaces the structure from
in
source
to the structure to
. Let’s start with an example.
my $source = <<'SOURCE';
print(power(10, 2));
print(power(10, 3))
SOURCE
print replace($source, 'power(:b, 2)', 'twice(:b)') . "\n";
In this example we replace the power
function with the twice
function, but
only if the exponent equals 2
. The power call with exponent 3
is not
replaced.
The function replace
parses all three arguments $source
, $from
and $to
.
It searches for the $from
structure using the _expr_match
function, which
returns the matching structural variables in the third parameter.
To play with this you should git clone
the gist and run the test.pl
program.
Changing the $source
, $from
and $to
allows you to try different things.