in reply to Regular Expressions and atomic weights
Writing a parser for such simple notation is not that hard. What you can do to make it even easier is to combine the weight calculations with actual parsing. This is called syntax-directed evaluation. You don't see syntax-directed evaluation much in the parsing of programming languages, but for simpler expression languages where each part of the expression has a value, and you are parsing the expression for the sole purpose of computing its final value (think of a simple math expression calculator).
This is probably what those other CPAN modules are doing. Actually, since they do more than just compute the weight, they probably parse the chemical formula into a tree structure first, and do the weight calculation on that tree. If you only do the weights, you can save yourself having to use an awkward intermediate tree representation.use Parse::RecDescent; use List::Util 'sum'; use vars '%weights'; %weights = qw( C 12 O 16 Pb 207 ); my $g = Parse::RecDescent->new(<<'END_GRAMMAR'); weight: compound { $item[1] } compound: group(s) { ::sum( @{$item[1]} ) } group: element /\d+/ { $item[1] * $item[2] } | element { $item[1] } element: /[A-Z][a-z]*/ { $::weights{ $item[1] } } | "(" compound")" { $item[2] } END_GRAMMAR print $g->weight("Pb(CO3)2"), $/; # prints 327
blokhead
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Regular Expressions and atomic weights
by ikegami (Patriarch) on Jul 25, 2005 at 18:25 UTC | |
by Your Mother (Archbishop) on Jul 25, 2005 at 19:26 UTC |