NAME
Grammar::Marpa - Regexp-overloading wrapper around Marpa::R2::Scanless
VERSION
Version 2.004
SYNOPSIS
use Grammar::Marpa;
my $dsl = <<'END_OF_DSL';
:default ::= action => ::first
:start ::= Expression
Expression ::= Term
Term ::= Factor
| Term '+' Term action => do_add
Factor ::= Number
| Factor '*' Factor action => do_multiply
Number ~ digits
digits ~ [\d]+
:discard ~ whitespace
whitespace ~ [\s]+
END_OF_DSL
sub M::do_add {
my (undef, $t1, undef, $t2) = @_;
return $t1 + $t2;
}
sub M::do_multiply {
my (undef, $t1, undef, $t2) = @_;
return $t1 * $t2;
}
my $g = Grammar::Marpa->new({ source => $dsl, semantics_package => 'M');
'1 + 2 * 3' =~ $g;
say $^R; # '7'
DESCRIPTION
This module provides a quick & dirty interface to Marpa::R2's Scanless interface, including overloading the '=~' operator in a way that is only slightly inconvenient.
CONSTRUCTORS
Grammar::Marpa->new()
PREFERRED: Create a new grammar object, based on the provided arguments, which take one of the following forms:
- GRAMMAR, PACKAGE
-
Specify the source EBNF and the Semantics Package. If no Semantics Package is provided, the Semantics must provided by the calling package.
- ARGS
-
Hash or hashref containing arguments for both the Grammar and the Recognizer objects that are contained inside this object. Valid keys include (inter alia):
- bless_package
- semantics_package
- trace_file_handle
- trace_terminals
- trace_values
See the appropriate documentation for Marpa::R2::Scanless to understand the meanings of those arguments.
You may also combine the GRAMMAR argument, the optional PACKAGE argument, and any additional options as a hash or hashref.
Grammar::Marpa(GRAMMAR, PACKAGE)
DEPRECATED: Create a new grammar object, based on a well-formed SLIF EBNF grammar (which must be provided as a scalar string) and using the specified package to provide the semantics of the grammar.
USAGE
Parsing
Once you have a grammar object, you can parse a string by performing either of
$string =~ $grammar;
$value = $grammar->parse($string);
Getting the result
If you have parsed a string with the '=~' overload, the $^R variable will contain the value of the last parse.
If you parse a string usintg the parse() method, the return value will be the value of that parse.
DIFFERENCES FROM v1.000
The previous version of this module would Carp::confess() if no parse was found.
The current version simply returns implicit undef.
LICENSE
Artistic 2.0