Try adding this line at the beginning:
lexeme default = latm => 1

It tells Marpa to switch from its usual longest tokens matching (LTM) to LATM -- longest *acceptable* tokens matching. In other words, it tells Marpa to be a little smarter about lexing, and don't bother with lexemes that wouldn't be acceptable to the parser.

LATM is not the default because of, once again, backward compatibility. It wasn't the default originally, because LTM is the tradition -- traditionally the lexer gets no help from the parser, so it just blindly serves up one token and the parser just has to deal with it.

It's actually a good idea to start all new scripts by setting LATM as the default.

I tested with your script and this change takes things past the problem you reported and abends later on. If that means there still are issues, let me know.

-- jeffrey

On 03/18/2014 03:46 PM, John Alvord wrote:
I have made good progress but have hit another sticking point. A smallest test program is here

https://gist.github.com/jalvo2014/9631309

The sample fragment I am parsing in the test program is

my $ipdt = "*IF *VALUE i5OS_IOA_Cache_Battery.State *EQ Error";

The G1 rule is here [there is an earlier rule that strips out the *IF]

<basic_condition> ::= '*VALUE' <attribute> <comparison> <compare_string> action => do_basic

Attribute has rules

<attribute>              ::= id '.' id | id

<alpha>              ~ [A-Za-z%*]

<alphanump>              ~ [A-Za-z0-9_%/]*

<id>                ~ <alpha><alphanump>

Which should pick out the two parts -sort of table and column name

next is

<comparison>          ::= '*EQ' | '*GE' | '*GT' | '*LE' | '*LT' | '*NE'

The last section - compare_string

<compare_string> ::=   <literal_word>
<literal_word> ~ [\S]+

I wanted to get that as a text blob. The problem I get is that the attribute section is being managed by <literal_word> and the <attribute> logic is being ignored, The end of the tracing looks like this

Lexer "L0" rejected lexeme L1c12-39: literal_word; value="i5OS_IOA_Cache_Battery
.State"
Error in SLIF parse: No lexemes accepted at line 1, column 12
Rejected lexeme #0: Lexer "L0"; literal_word; value="i5OS_IOA_Cache_Battery.St
ate"; length = 28
* String before error: *IF *VALUE\s
* The error was at line 1, column 12, and at character 0x0069 'i', ...
* here: i5OS_IOA_Cache_Battery.State *EQ Error

I figure there has to be some ordering about which rules to apply but have not found them after several hours.

John Alvord






On Sun, Mar 16, 2014 at 12:14 PM, John Alvord <[email protected] <mailto:[email protected]>> wrote:

    Thanks Jeffrey - worked just fine. Later I found some of the
    values were array and some not.

    Project back on track!!

    John Alvord


    On Sat, Mar 15, 2014 at 5:17 PM, Jeffrey Kegler
    <[email protected]
    <mailto:[email protected]>> wrote:

        I forked this and made a couple of changes
        <https://gist.github.com/jeffreykegler/9575923/revisions> that
        should get you going on the semantics.  I could not figure out
        how to send a pull request.  Is that possible for gists?

        By default rules, rules return 'undef', which explains what
        you were seeing.

        To get started on a script, it is best to change that default,
        as I did in the gist, adding this line:

        :default ::= action => ::array

        It should be the default, but is not for reasons of backward
        compatibility.

        Hope this helps, jeffrey


        On 03/15/2014 04:46 PM, John Alvord wrote:
        I've been a lurker for a while and have recently been testing
        marpa on a current project.

        I am working with a mini-language which gets translated into
        SQL finally. Here is a  minimal sample

        my $input="*IF *VALUE Log_Entries.Log_Name *EQ errlog ";

        I created a gist here
        https://gist.github.com/jalvo2014/9575539 with a test
        program. It includes a BNF file and [after debugging the BNF
        ] I put an action on one of the rules and a routine to get
        control.

        <basic_condition>     ::= <basic_function> <attribute>
        <comparison> <literal>   action => do_basic

        ...


        $recce = Marpa::R2::Scanless::R->new(
                { grammar => $grammar,
                  semantics_package => 'My_Actions',
                  trace_terminals => 1,
                  trace_values => 1,
                });

        ...

        sub My_Actions::do_basic {
            my ( undef, $t1, $t2, $t3, $t4 ) = @_;
            if (defined $t1) {
        $DB::single=2;
            print "My_Actions::do_basic: $t1 $t2 $t3 $t4\n";
                        return undef;
            }
        }

        but when the do_basic gets control all the $t1/$t2/$t3/$t4
        are undef. After struggling for a week - likely on something
        simple - I could really use some help.

        Thanks.

        John Alvord
-- 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
        [email protected]
        <mailto:[email protected]>.
        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 [email protected]
        <mailto:[email protected]>.
        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 [email protected] <mailto:[email protected]>.
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to