Greetings Jeffrey and all,

I'm just getting started with Marpa::R2::Scanless. I have a lot of high 
hopes related to using Marpa:

* (currently in progress) migrate Language::Expr from using 
Regexp::Grammar. With RG there are lots of problems: limitations when 
writing grammar (e.g. have to avoid left recursion), exponential parsing 
time as the length of input string increases, the whole debacle of failure 
to run under Perl 5.18, limited error message/diagnostics, reentrace 
problem (can't use regex matching in action code), etc.

* migrate Org::Parser from parsing with regex, with the hope of speeding up 
the parsing (and improve the readability of the parser code :-) ). Parsing 
my 400KB (8000 lines) todo.org file takes about 0.8-1s on my Core i7-4770 
PC (and probably a couple of seconds on my Core i5 laptop), I wish the time 
could go down to at least 0.1-0.2s.

* write a markdown parser and markdown-to-POD converter. The current 
Markdown::POD module uses Markdent which is Moose-based and has a heavy 
startup cost, about 0.4s on a fast computer and 1+s on a rather slow one, 
which is annoying for command-line scripts. It also has trouble parsing _ 
(emphasis), causing text like 'some_identifier and another_identifier' to 
be converted to POD 'someI<identifier and another>identifier'.

* rewrite my Ledger::Parser to using Marpa and increase its compliance and 
feature support.

* write more parsers and converters for other formats which I so far 
haven't done because the tools I had at my hand are just Perl regex and 
Regexp::Grammars.

For now I'm playing and exercising with some simple grammars. I was 
wondering whether Marpa BNF can (or will) support the "zero-or-one" 
quantifier ? like commonly found in regexp. This is convenient when stating 
a list of things that are optional but need to be in order. For example, 
consider the case of parsing ISO 8601 date duration (I apologize in advance 
for using MarpaX::Simple, it's just a thin wrapper to keep things as simple 
and as short as possible):

----------------------------
#!/usr/bin/env perl

# parses ISO 8601 duration literal

use 5.010;
use MarpaX::Simple qw(gen_parser);

my $parser = gen_parser(
grammar => <<'_',
:start ::= duration_literal

duration_literal ~ 'P' year_opt month_opt week_opt day_opt
    | 'P' year_opt month_opt week_opt day_opt 'T' hour_opt minute_opt 
second_opt

year_opt ~ posnum 'Y'
year_opt ~
month_opt ~ posnum 'M'
month_opt ~
week_opt ~ posnum 'W'
week_opt ~
day_opt ~ posnum 'D'
day_opt ~
hour_opt ~ posnum 'H'
hour_opt ~
minute_opt ~ posnum 'M'
minute_opt ~
second_opt ~ posnum 'S'
second_opt ~

posnum ~ digits
    | digits '.' digits
digits ~ [0-9]+
_
);

$parser->('P');
$parser->('P1Y');
$parser->('P2M');
$parser->('P2MT2M');
---------------------

It would be nice if I could write (or can I?) something like this like in a 
regexp:

---------------------
duration_literal ~ 'P' year? month? week? day?
    | 'P' year? month? week? 'T' hour? minute? second?

year ~ posnum 'Y'
month ~ posnum 'M'
# and so on
---------------------

Expect more (stupid) questions from me :-)

Regards,
Steven

-- 
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