Permalink
Browse files

Initial import. A few test scripts that succeed even. Fantastic.

  • Loading branch information...
0 parents commit 3029f81f403e8ca34939fabecc36c38f9f3724a8 @cosimo committed Jun 6, 2010
201 LICENSE
@@ -0,0 +1,201 @@
+ The Artistic License 2.0
+
+ Copyright (c) 2000-2006, The Perl Foundation.
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+This license establishes the terms under which a given free software
+Package may be copied, modified, distributed, and/or redistributed.
+The intent is that the Copyright Holder maintains some artistic
+control over the development of that Package while still keeping the
+Package available as open source and free software.
+
+You are always permitted to make arrangements wholly outside of this
+license directly with the Copyright Holder of a given Package. If the
+terms of this license do not permit the full use that you propose to
+make of the Package, you should contact the Copyright Holder and seek
+a different licensing arrangement.
+
+Definitions
+
+ "Copyright Holder" means the individual(s) or organization(s)
+ named in the copyright notice for the entire Package.
+
+ "Contributor" means any party that has contributed code or other
+ material to the Package, in accordance with the Copyright Holder's
+ procedures.
+
+ "You" and "your" means any person who would like to copy,
+ distribute, or modify the Package.
+
+ "Package" means the collection of files distributed by the
+ Copyright Holder, and derivatives of that collection and/or of
+ those files. A given Package may consist of either the Standard
+ Version, or a Modified Version.
+
+ "Distribute" means providing a copy of the Package or making it
+ accessible to anyone else, or in the case of a company or
+ organization, to others outside of your company or organization.
+
+ "Distributor Fee" means any fee that you charge for Distributing
+ this Package or providing support for this Package to another
+ party. It does not mean licensing fees.
+
+ "Standard Version" refers to the Package if it has not been
+ modified, or has been modified only in ways explicitly requested
+ by the Copyright Holder.
+
+ "Modified Version" means the Package, if it has been changed, and
+ such changes were not explicitly requested by the Copyright
+ Holder.
+
+ "Original License" means this Artistic License as Distributed with
+ the Standard Version of the Package, in its current version or as
+ it may be modified by The Perl Foundation in the future.
+
+ "Source" form means the source code, documentation source, and
+ configuration files for the Package.
+
+ "Compiled" form means the compiled bytecode, object code, binary,
+ or any other form resulting from mechanical transformation or
+ translation of the Source form.
+
+
+Permission for Use and Modification Without Distribution
+
+(1) You are permitted to use the Standard Version and create and use
+Modified Versions for any purpose without restriction, provided that
+you do not Distribute the Modified Version.
+
+
+Permissions for Redistribution of the Standard Version
+
+(2) You may Distribute verbatim copies of the Source form of the
+Standard Version of this Package in any medium without restriction,
+either gratis or for a Distributor Fee, provided that you duplicate
+all of the original copyright notices and associated disclaimers. At
+your discretion, such verbatim copies may or may not include a
+Compiled form of the Package.
+
+(3) You may apply any bug fixes, portability changes, and other
+modifications made available from the Copyright Holder. The resulting
+Package will still be considered the Standard Version, and as such
+will be subject to the Original License.
+
+
+Distribution of Modified Versions of the Package as Source
+
+(4) You may Distribute your Modified Version as Source (either gratis
+or for a Distributor Fee, and with or without a Compiled form of the
+Modified Version) provided that you clearly document how it differs
+from the Standard Version, including, but not limited to, documenting
+any non-standard features, executables, or modules, and provided that
+you do at least ONE of the following:
+
+ (a) make the Modified Version available to the Copyright Holder
+ of the Standard Version, under the Original License, so that the
+ Copyright Holder may include your modifications in the Standard
+ Version.
+
+ (b) ensure that installation of your Modified Version does not
+ prevent the user installing or running the Standard Version. In
+ addition, the Modified Version must bear a name that is different
+ from the name of the Standard Version.
+
+ (c) allow anyone who receives a copy of the Modified Version to
+ make the Source form of the Modified Version available to others
+ under
+
+ (i) the Original License or
+
+ (ii) a license that permits the licensee to freely copy,
+ modify and redistribute the Modified Version using the same
+ licensing terms that apply to the copy that the licensee
+ received, and requires that the Source form of the Modified
+ Version, and of any works derived from it, be made freely
+ available in that license fees are prohibited but Distributor
+ Fees are allowed.
+
+
+Distribution of Compiled Forms of the Standard Version
+or Modified Versions without the Source
+
+(5) You may Distribute Compiled forms of the Standard Version without
+the Source, provided that you include complete instructions on how to
+get the Source of the Standard Version. Such instructions must be
+valid at the time of your distribution. If these instructions, at any
+time while you are carrying out such distribution, become invalid, you
+must provide new instructions on demand or cease further distribution.
+If you provide valid instructions or cease distribution within thirty
+days after you become aware that the instructions are invalid, then
+you do not forfeit any of your rights under this license.
+
+(6) You may Distribute a Modified Version in Compiled form without
+the Source, provided that you comply with Section 4 with respect to
+the Source of the Modified Version.
+
+
+Aggregating or Linking the Package
+
+(7) You may aggregate the Package (either the Standard Version or
+Modified Version) with other packages and Distribute the resulting
+aggregation provided that you do not charge a licensing fee for the
+Package. Distributor Fees are permitted, and licensing fees for other
+components in the aggregation are permitted. The terms of this license
+apply to the use and Distribution of the Standard or Modified Versions
+as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with
+other works, to embed the Package in a larger work of your own, or to
+build stand-alone binary or bytecode versions of applications that
+include the Package, and Distribute the result without restriction,
+provided the result does not expose a direct interface to the Package.
+
+
+Items That are Not Considered Part of a Modified Version
+
+(9) Works (including, but not limited to, modules and scripts) that
+merely extend or make use of the Package, do not, by themselves, cause
+the Package to be a Modified Version. In addition, such works are not
+considered parts of the Package itself, and are not subject to the
+terms of this license.
+
+
+General Provisions
+
+(10) Any use, modification, and distribution of the Standard or
+Modified Versions is governed by this Artistic License. By using,
+modifying or distributing the Package, you accept this license. Do not
+use, modify, or distribute the Package, if you do not accept this
+license.
+
+(11) If your Modified Version has been derived from a Modified
+Version made by someone other than you, you are nevertheless required
+to ensure that your Modified Version complies with the requirements of
+this license.
+
+(12) This license does not grant you the right to use any trademark,
+service mark, tradename, or logo of the Copyright Holder.
+
+(13) This license includes the non-exclusive, worldwide,
+free-of-charge patent license to make, have made, use, offer to sell,
+sell, import and otherwise transfer the Package with respect to any
+patent claims licensable by the Copyright Holder that are necessarily
+infringed by the Package. If you institute patent litigation
+(including a cross-claim or counterclaim) against any party alleging
+that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the
+date that such litigation is filed.
+
+(14) Disclaimer of Warranty:
+THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
+LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 README
@@ -0,0 +1,29 @@
+NAME
+ perl6-puppet-parser
+
+SYNOPSIS
+ use v6;
+ use Puppet::Parser;
+
+ # Just a stupid example
+ my $module = 'class { foo }';
+
+ my $parsed = Puppet::Parser::Grammar.parse($module);
+ say $parsed.perl;
+
+DESCRIPTION
+ (Aims to be a) module to:
+
+ parse Puppet modules
+ automatically build documentation for them
+
+ We're far away from that.
+
+ This is mostly my initial attempts at learning Perl 6 grammars.
+
+AUTHORS
+ Cosimo Streppone, <cosimo@cpan.org>
+
+LICENSE
+ This module is released under Artistic 2.0. See LICENSE.
+
@@ -0,0 +1,18 @@
+grammar Puppet::Parser::Grammar {
+ token TOP {
+ <class>?
+ }
+ token class {
+ 'class' <.ws> '{' <.ws> <class_body> <.ws> '}'
+ }
+ token class_body {
+ 'ahaha'
+ }
+}
+
+my $text = 'class { ahaha }';
+my $parsed = Puppet::Parser::Grammar.parse($text);
+
+say $parsed ?? 'yes' !! 'no';
+say $parsed.perl;
+
@@ -0,0 +1,25 @@
+grammar Puppet::Parser::Grammar {
+ token TOP {
+ <class>?
+ }
+
+ token class {
+ 'class' <.ws> <identifier> <.ws> '{' <.ws> <class_body> <.ws> '}'
+ }
+
+ regex identifier {
+ \w+
+ }
+
+ # class_body as \N+ doesn't work! Why???
+ token class_body {
+ \w+
+ }
+}
+
+my $text = 'class foo { bar }';
+my $parsed = Puppet::Parser::Grammar.parse($text);
+
+say $parsed ?? 'yes' !! 'no';
+say $parsed.perl;
+
@@ -0,0 +1,21 @@
+grammar Puppet::Parser::Grammar {
+ token TOP {
+ <class>?
+ }
+ token class {
+ 'class' <.ws> <identifier> <.ws> '{' <.ws> <class_body> <.ws> '}'
+ }
+ regex identifier {
+ \w+
+ }
+ token class_body {
+ \w+
+ }
+}
+
+my $text = "class foo \{\nbar\n\}\n";
+my $parsed = Puppet::Parser::Grammar.parse($text);
+
+say $parsed ?? 'yes' !! 'no';
+say $parsed.perl;
+
@@ -0,0 +1,3 @@
+Step by step versions archived for future reference.
+Mostly stupid tries.
+
@@ -0,0 +1,81 @@
+=pod
+
+=head1 NAME
+
+Idiots guide to Perl6 grammars
+
+=head1 DESCRIPTION
+
+Dumpster of all quick notes and tips on how I'm trying to build my first functional Perl6 Grammar.
+
+B<Don't expect to find something interesting here...>
+
+You have been warned :)
+
+=head2 Some #perl6 IRC log from 2010-06-06
+
+ 09:24 < cosimo> say for example,
+ 09:25 < cosimo> regex TOP { ^ <line> ** \n <empty_line>? $ }
+ 09:25 < cosimo> what is '^'? and '**' ? how can I find out?
+ 09:25 < masak> cosimo: my advice: write tests for the existing grammar, not necessarily as Perl 6 code. implement the new grammar such that it passes the new tests.
+ 09:25 <@pmichaud> cosimo: oh, Synopsis 5.
+ 09:25 < PerlJam> cosimo: read S05
+ 09:25 < JimmyZ> masak: were they bugs last time I showed you?
+ 09:26 <@pmichaud> ^ means "start of string".
+ 09:26 < cosimo> PerlJam: pmichaud: great, thansk
+ 09:26 < masak> JimmyZ: I think they were. but weren't they reported to RT already?
+ 09:26 < cosimo> thanks, even
+ 09:26 <@pmichaud> ** is the repetition quantifier
+ 09:27 < PerlJam> cosimo: people here are always happy to share what they know too.
+ 09:27 < JimmyZ> masak: I sent it. but I can't find it in RT
+ 09:27 < cosimo> pmichaud: and, why it uses regex and not token for example?
+ 09:27 < sorear> Read S05.
+ 09:27 <@pmichaud> 'regex' backtracks, 'token' doesn't.
+ 09:28 < masak> JimmyZ: I thought I saw it as a comment on an existing bug. so maybe moritz_ or someone merged it into an older ticket, also submitted by you?
+ 09:28 <@pmichaud> (in many parsers, backtracking isn't needed, and explicitly declaring such makes for a more efficient parse)
+ 09:28 < masak> or it simply didn't get through.
+ 09:29 < cosimo> ok, I'll go read S05 then. I wanted to write a real app, and I think I found an excellent use case :)
+ 09:29 < JimmyZ> masak: which RT?
+ 09:29 < masak> cosimo: when to use 'regex', 'token' and 'rule' is still something that doesn't come naturally to me. it's a fingertips thing, I suspect. I usually use
+ 'regex' until it's totally clear by circumstantial evidence that I should upgrade to 'token', ditto 'token' -> 'rule'.
+ 09:29 < JimmyZ> masak: I can't see my email in p6c too.
+ 09:30 < masak> JimmyZ: I don't know. my regular powers are diminished, because I'm not at my own keyboard.
+ 09:30 < JimmyZ> oh, okay
+ 09:30 <@pmichaud> my guidelines: use 'rule' when you expect the parts of the regex to be separated by whitespace.
+ 09:31 <@pmichaud> use 'token' when you're defining something where each part is all-or-nothing
+ 09:31 < masak> if you find yourself adding explicit <.ws> calls everywhere, that's a good sigh you should be using 'rule'.
+ 09:31 <@pmichaud> or \s*
+ 09:31 <@pmichaud> or \s+
+ 09:31 < masak> eww! :P
+ 09:32 <@pmichaud> no, I mean if you're writing \s* or \s+ everywhere, that's a good sign you should be using 'rule'
+ 09:32 <@pmichaud> not that you should rewrite <.ws> with \s* or \s+
+ 09:32 < PerlJam> btw, these rules-of-thumb we've all independently discovered (more or less). I wonder if it's time for a "grammars best practices" or "grammar
+ writing guide" or something.
+ 09:33 < masak> pmichaud: yes, I know. still, I don't tend to write <.ws> like that.
+
+=head2 Random problems I encountered
+
+=over 4
+
+=item * Can't put '-' in token name (class-body => class_body)
+
+=item * Q{...} has to have escaped '{' literals, as in Q{sub bar \{ ... \}}
+
+=item * Can't use \N+ instead of \w+. Why?
+
+=back
+
+=head2 TO BE CONTINUED
+
+...
+
+=head1 REPOSITORY
+
+ http://github.com/cosimo/perl6-puppet-parser/
+
+=head1 AUTHORS
+
+Cosimo E<lt>cosimo@cpan.orgE<gt>
+
+=end
+
Oops, something went wrong.

0 comments on commit 3029f81

Please sign in to comment.