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.