Off the top of my head and not tested, but:

I think you're trying to use the parentheses for grouping, but you have not
written the grammar to do that.

For an example of how see the synopsis of the Scanless::G POD
<http://search.cpan.org/dist/Marpa-R2/pod/Scanless/G.pod>.

I hope this helps!

On Thu, Feb 2, 2017 at 9:37 PM, <mha...@gmail.com> wrote:

> I am using the simple boolean expression grammar below to learn how to use
> Marpa::R2. I am trying to understand how the Marpa loosen operator works.
>
> #!/usr/bin/perl
>
> use lib qw(/opt/share/perl/lib/perl5');
>
> use strict;
> use warnings;
> use Marpa::R2;
>
> my $BOOLEAN_EXPRESSION_DSL = q(
> :default ::= action => eval
> lexeme default = latm => 1
> <boolean expression> ::=
>       <bit>
>     | ('(') <boolean expression> (')') action => ::first
>     | ('!') <boolean expression> action => not
>     | <boolean expression> '&&' <boolean expression> assoc => left action
> => and
>    || <boolean expression> '||' <boolean expression> assoc => left action
> => or
> <bit> ~ [01]
> <blank> ~ [\s]+
> :discard ~ <blank>
> );
> my $BOOLEAN_EXPRESSION_GRAMMAR = Marpa::R2::Scanless::G->new({source =>
> \$BOOLEAN_EXPRESSION_DSL});
>
> sub parse
> {
>     my $e = shift;
>     my $recce = Marpa::R2::Scanless::R->new({grammar =>
> $BOOLEAN_EXPRESSION_GRAMMAR, semantics_package =>
> 'BOOLEAN_EXPRESSION_ACTIONS'});
>     my $length_read = $recce->read(\$e);
>     ($length_read != length $e) and die("!!!ERROR: Syntax error in boolean
> expression [$e:$length_read].\n");
>     my $ambiguous_status = $recce->ambiguous();
>     ($ambiguous_status) and die("!!!ERROR: Parse is
> ambiguous:\n$ambiguous_status");
>     my $ret = $recce->value;
>     print $$ret . "\n";
> }
>
> parse("0 && (1 || 1)");
>
> sub BOOLEAN_EXPRESSION_ACTIONS::not
> {
>     my (undef, $b) = @_;
>     return $b != 0 ? 0 : 1;
> }
>
> sub BOOLEAN_EXPRESSION_ACTIONS::and
> {
>     my (undef, $lhs, undef, $rhs) = @_;
>     return ($lhs != 0 and $rhs != 0) ? 1 : 0;
> }
>
> sub BOOLEAN_EXPRESSION_ACTIONS::eval
> {
>     my (undef, $v) = @_;
>     return (defined $v and $v != 0) ? 1 : 0;
> }
>
> When I run the program above I get this error:
>
> Error in SLIF parse: No lexeme found at line 1, column 9
> * String before error: 0 && (1\s
> * The error was at line 1, column 9, and at character 0x007c '|', ...
> * here: || 1)
> Marpa::R2 exception at ./test.pl line 29.
>
> If I change my grammar and replace the loosen operator with the
> alternation operator, then it works! Why?
>
> I am trying to use '||' to make the grammar unambiguous, so that I can
> drop the parenthesis, and be able to write 0 && 1 || 1.
>
> Thank you!
>
> --
> You received this message because you are subscribed to the Google Groups
> "marpa parser" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to marpa-parser+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"marpa parser" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to marpa-parser+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to