I had a nice idea a few days ago. A simple module that creates the rules part of a Marpa grammar, but without code generation and lexers. Just the bit that Marpa::XS::Grammar uses.
So I wrote it in a few minutes. It’s not really complicated and provides an example how to write a short parser.
Lets start with a short example of what you would write.
use Marpa::XS;
use MarpaX::Simple::Rules 'parse_rules';
my $rules = parse_rules(<<"RULES");
RULES
my $grammar = Marpa::XS::Grammar->new({
rules => $rules,
...
});
At the ...
you should add more arguments to Marpa::XS depending on how you
want to use it. Now let’s write a simple example of some rules.
my $rules = parse_rules(<<"RULES");
expr ::= term
term ::= term plus term
term ::= factor
factor ::= factor mul factor
factor ::= number
RULES
These rules don’t yet contain actions, so Marpa will call the default_action
or a function named like that left hand side name. For information you should
take a look at the Marpa::XS documentation.
Now let’s some specific action to all the rules. We do this by adding => action_name
to the end of each of the rules.
my $rules = parse_rules(<<"RULES");
expr ::= term => arg_0
term ::= term plus term => plus
term ::= factor => arg_0
factor ::= factor mul factor => mul
factor ::= number => arg_0
RULES
No functions are provided for you. The names like arg_0
are just generic
functions that you should write yourself. If you create a package that uses
this module you could use the actions
argument for the grammar.
my $grammar = Marpa::XS::Grammar->new({
...
actions => __PACKAGE__,
...
});
If you write the functions like the following, the Marpa will call the right thing.
package YYY;
...
sub arg_0 {
shift; return $_[0];
}
...
I will release the code to CPAN so it will appear somewhat later, but you can already take a look at it at github/MarpaX::Simple::Rules.