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
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
replace parses all three arguments
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
$to allows you to try different things.