Parsing: top-down versus bottom-up

[ This is cross-posted by invitation, from its home on the Ocean of Awareness blog. ]

Comparisons between top-down and bottom-up parsing are often either too high-level or too low-level. Overly high-level treatments reduce the two approaches to buzzwords, and the comparison to a recitation of received wisdom. Overly low-level treatments get immersed in the minutiae of implementation, and the resulting comparison is as revealing as placing two abstractly related code listings side by side. In this post I hope to find the middle level; to shed light on why advocates of bottom-up and top-down parsing approaches take the positions they do; and to speculate about the way forward.

Top-down parsing

The basic idea of top-down parsing is as brutally simple as anything in programming: Starting at the top, we add pieces. We do this by looking at the next token and deciding then and there where it fits into the parse tree. Once we've looked at every token, we have our parse tree.

Git-Like Menus


[Pleased as I was to get mentioned in a lightning talk in this year’s YAPC, I noted that my mention was in the context of writing blog posts that “don’t contain much code.”1  Well, fair enough: I’m a verbose bugger, and a wannabe writer, so my prose does tend to ramble.  But I can do code, dammit.  So, you know ... here’s some code.]

The other day I was working on my music library scripts,2 and I needed a menu for something.  Now, there are oodles and oodles of modules on CPAN to help you write menus.  I’ve looked at most of them, and tried quite a few, but long ago I settled on using the -menu option in IO::Prompter, by the Damian.  For a nice, pretty menu layout—say, something you do as a central feature for a program—it’s tough to beat.  It’s not perfect, by any stretch, but it offers some very nice features, such as (optionally) not requiring ENTER after a menu choice.

But that’s not what I wanted in this case.  What I was looking for here was a quick, compact menu ... sort of like what you get when you’re interactively staging a commit in git (that is, git add -p, or, probably more commonly, git add -i then choose “patch”).  Specifically, the features I wanted were:

Buftabline – forget Vim tabs, now you can have buffer tabs

I just released Buftabline, a Vim plugin that takes over the tabline and renders the buffer list in it instead of a tab list. It is designed with the ideal that it should Just Work, and has no configurable behaviour: drop it into your configuration and you’re done.

There are comparisons with several alternative plugins in the README, as well as an explanation of why you probably want this rather than using Vim’s built-in tabs.

Share and enjoy.

We are all Perl's ambassadors...

I wonder how many newbies in the whole history of Perl had their "llama" arrive from Amazon and shortly thereafter—in a fever pitch of excitement—managed to create a distribution they thought was the best thing since sliced bread and upload it to CPAN only to have their debut into our wonderful, loving community met by a CPAN rater. After which, naturally, they slowly backed out of the room, closed the door behind them, picked up their (PHP|Ruby|Python|Javascript) book and never coded a line of perl again...

Surely, no one can say but maybe—just maybe—we'd be better off with a system similar to Stack Overflow where a user has to have a certain number of points or special kind of badge (e.g. the Teacher, Ambassador, the "Empathy Lieutenant", the "brian d foy", etc) in order to leave a rating on someone's first distribution.

I dunno. It's worth a thought, because this whole thing just made me cringe...

Tour of Imager

I’ve posted my slides for the Tour of Imager talk I gave earlier this week at MadMongers. If you are interested in processing photos or drawing in Perl, you’ll want to check this out.

[From my blog.]

mop minus proposal

I'm creating mop-minus-proposal project on GitHub. Current experimental mop implementation need big core change. so I think writable object orientation support is needed without core change or with minimal core change.


mop-minus-proposal

The following is example. This is not only specification. This code work on Perl 5.20.1+. Important thing is that the following code don't use Perl source filter, such as Filter::Simple.

# Point.pm
package Point {
  use mop::minus;

  has x = 0;
  has y = 0;

  # will be "method clear { ... }"
  sub clear ($self) {
    $self->x(0);
    $self->y(0);
  }
}

1;

# Point3D.pm
package Point3D {
  use mop::minus;

  extends Point;
  with Role1, Role2;

  has z = 0;

  # will be "method clear { ... }"
  sub clear ($self) {
    $self->z(0);
  }
}

1;

# Role1.pm
package Role1 {
  use mop::minus;

  # will be "method foo { ... }"
  sub foo {
    return 'foo';
  }
}

1;

# Role2.pm
package Role1 {
  use mop::minus;

  # will be "method bar { ... }"
  sub bar {
    return 'bar';
  }
}

1;

# main.pl
use Point3D;
my $point = Point3D->new;
print $point->x(0);
my $x = $point->x;

GitPrep 1.9 release, Atom feed of commit log support, short ssl url support

I released GitPrep 1.9. You can install portable GitHub system into Unix / Linux easily. It is second major release.

Because you can install GitPrep into your own server, you can create users and repositories without limit. You can use GitPrep freely because GitPrep is free software. You can also install GitPrep into shared rental server.

GitPrep (Document and Repository)

Features added in 1.9 are:

  • add ssh_rep_url_base to cnahge or hide ssh URL user directory
  • add atom feed of commits page. for example, http://somehost.com/kimoto/gitprep_t/commits/master.atom

In version 1.9, by using ssh_rep_url_base option, you can hide user home directory in ssh url when you use public authentication. For example, You can do the following.

ssh://gitprep@59.106.185.196:55555/kimoto/gitprep_t.git

And, Gitprep support atom feed of commit log, so you can check other people commit by rss reader.

Let's use usufully.

Example

You can try GitPrep example.

GitPrep Example

Download

Download

Document

GitPrep Document and Repositry

How to write a Developer CV/Résumé that will get you hired

Slides from my LPW talk are now online!

How to write a Developer CV/Résumé that will get you hired.

About blogs.perl.org

blogs.perl.org is a common blogging platform for the Perl community. Written in Perl and offering the modern features you’ve come to expect in blog platforms, the site is run by Dave Cross and Aaron Crane, with a design donated by Six Apart, Ltd.