New parser, based on Irony.

The previous parsing engine was GOLD Parser. That system had a number of problems:

- Inflexible treatment of whitespace and regex. PowerShell does some weird stuff, like with newlines & escaping. ("`\r\n")

- Strict BNF. The PowerShell grammar is pretty conservative about notation, but it does use optional terms in BNF rules. GOLD would require us to define a new rule for each optional term.

- Closed source engine. (Although the C# code generator is open source.)

- A custom input language. No IDE support for that language.

Irony addresses these concerns. You write the grammar in C#, using an internal DSL. For the most part it's a win, but one unfortunate consequence is that accessing the new AST is not typesafe. AST nodes are always returned as `object`, and must be casted. I hope we can find a way to improve this.

Irony comes from irony.codeplex.com

I have made a handful of changes to Irony. I would like to see them folded back in, but the Irony maintainers
may not go for that. We'll see.

For the most part, Pash still behaves the same with to the end user, with some exceptions:

- REGRESSION: The prompt is not colorful.

- REGRESSION: The prompt has an extranious newline at the end.

- FEATURE: You can now use pipelines (limited testing)

There are now some unit tests, run automatically with NUnit at the end of the build.

-----

Squashed commit of the following:

commit 4f18aeb74d4d5f885c0eba3352b2ae00aabe67a2
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Mon Aug 27 17:47:35 2012 -0700

    Pipelines!

    Squashed commit of the following:

    commit 0b78b7c55dcbd29db644d1ff78f6c88dc1487a34
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 17:45:25 2012 -0700

        Pipelines seem to work.

        I did:
            PS> 'users' | cd

        and it took me to the right location.

    commit 6704591fb1572da7e6c0f4762e26499e496263cf
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 17:39:08 2012 -0700

        Use richer `BindArgument` for all argument sources.

    commit 030ebb82b9e88c734f00f50c7cb67dd1cb61a046
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 17:38:41 2012 -0700

        `BindArguments` converts to strings

        Mostly important if one comes in as a PSObject.

    commit 23661cfb2243040dfd2117c2ee9e63ed591c0819
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 17:30:32 2012 -0700

        REFACTOR: clean up new `BindArgument` function.

    commit b6797de8f3da470ac7f49777990879f2d0bde724
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 17:28:14 2012 -0700

        REFACTOR: Extract Method `CommandProcessor.BindArgument`

    commit 6477096205e9d3239528579a64437f7193459c1d
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 17:16:11 2012 -0700

        REFACTOR: Replace query with local.

        (The local already existed.)

    commit e65add88e0213ca1b74eb24a0161fb692ec38a5b
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 11:38:00 2012 -0700

        Trivial pipeline implementation.

        Only works with single-element pipelines, e.g.
           PS> Get-ChildItem

    commit e4fdd2a997d4a939cc645208bdecf8160ccb91c7
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Mon Aug 27 00:06:47 2012 -0700

        implement parsing for pipelines

    commit 544eebf21de75c8a09c944ab9636dbbfd9b63a3e
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Sun Aug 26 23:52:30 2012 -0700

        TEST: pipeline

commit e3b9e068dca186d635c5474b09abb54980d8042e
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 26 23:19:02 2012 -0700

    Enumerate arrays on output.

    The bug here was that arrays displayed as a type:

        PS> 1..3
        System.Int32[]

    This was a consequence of the switch to the new parser. Previously we
    would enumerate results for regular commands, but not for the prompt.

    Merging these code paths caused the prompt (a string) to print 1 letter
    per line (because strings are enumerable). As a temporary fix I disabled
    enumerating command output, which caused arrays to print as their type.

    Now I changed `PipeLineCommandRuntime.WriteObject` to not enumerating
    `string`s, even when you set the `enumerateCollection` flag. So both array
    outputs and prompts work again.

    Don't enumerate `string` in , ever.

    This let's

commit 15ef2b1f588a7220df1699d32169944cb1a302cd
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 26 01:15:10 2012 -0700

    REFACTORING: Rename `_node` -> `_astnode`, etc., to avoid confusion with concrete parse tree nodes.

    - Rename all ast node types to use the `_astnode`
    - Rename containing files to match.
    - Rename `Nodes` namespace -> `AstNodes`
    - Rename variables containing AST nodes to say `AstNode`.

commit 6e7957cea7169336959862d38d76871c759e49de
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 26 01:03:46 2012 -0700

    REFACTOR: Use new `_node.Text` property instead of digging in to parse tree.

commit b388380388ef37800dfe41ed0a740e1c3ff5c122
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 26 00:59:37 2012 -0700

    `DebuggerStepThrough` on `Pipeline.Invoke()`

commit a6d4a6fdad29f5754e90e9e7892bfe4f0d2dc2d3
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 26 00:58:52 2012 -0700

    Remove more unused nodes from old parser (ArrayNode, RangeNode, VariableNode)

    Since these now work in the new parser.

commit 309c01e87db8c7bc8a1fc910f8274077c982b6e5
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 26 00:58:26 2012 -0700

    Implement variables and assignment.

        PS> $x = 'y'
        PS> $x
        $x = y           # not quite right, but close.
        PS> $x = 1+2     # full expressions
        PS> $x
        PS> ${x} = 3     # braced format, too

commit d432d7ad35342e8ac60a65245ded263bcd688f07
Merge: 34c022d 8b53573
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 26 01:28:07 2012 -0700

    Merge branch 'integrate-new-parser' of https://github.com/JayBazuzi/Pash2 into integrate-new-parser

commit 8b53573553d7cc8e223ee6a0cbe71532893623ce
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sat Aug 25 19:17:04 2012 -0700

    More expression: array literals, array ranges, negative numbers.

    Squashed commit of the following:

    commit 34c022d2bee6668184aa30401b568bebf895b5d5
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Sat Aug 25 19:06:12 2012 -0700

        return arrays as `PSObject`s

    commit bab402c5b47671d2e0a768a76c081efdb8f6b748
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Sat Aug 25 14:45:43 2012 -0700

        Implement array literals ("1,2,3")

    commit 1626cbf8679f701741b2d55399d3ff877b4eddf0
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 23:47:44 2012 -0700

        Remove extra comment.

    commit 26c7cf7f3093a66415e5dc2b145cdc2526af102f
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 23:46:50 2012 -0700

        More array ranges: 5..1, -500..-495

    commit 815ddcf40fb0b104fedc3b8dbcd98711ee4cb0ed
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 22:55:19 2012 -0700

        Parse negation.

          PS> -7
          -7
          PS> 1 + -7
          -6

    commit 14b12bef33204c1b3f6059738a45b1ddfc35fa4e
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 22:08:58 2012 -0700

        TEST: REFACTOR: Extract Method in Ast tests

        Since we're doing the same thing over & over.

    commit 4e786963402722b7f49430d71f070620e16e628b
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 22:04:40 2012 -0700

        implement array ranges

        Now you can do:
          PS> 1,3
          1..3
        but the output shows the type (`int[]`) not the values. Later.

    commit 0f04b2410ea4b9b42190e176c333ad7821cc59ee
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 21:25:26 2012 -0700

        Typo in comment.

    commit 121e4917937a5ac5dd822b25481dad7dbe74f378
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 21:19:50 2012 -0700

        Improve error reporting in `_node.Execute()`.

commit 34c022d2bee6668184aa30401b568bebf895b5d5
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sat Aug 25 19:06:12 2012 -0700

    return arrays as `PSObject`s

commit bab402c5b47671d2e0a768a76c081efdb8f6b748
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sat Aug 25 14:45:43 2012 -0700

    Implement array literals ("1,2,3")

commit 1626cbf8679f701741b2d55399d3ff877b4eddf0
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 23:47:44 2012 -0700

    Remove extra comment.

commit 26c7cf7f3093a66415e5dc2b145cdc2526af102f
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 23:46:50 2012 -0700

    More array ranges: 5..1, -500..-495

commit 815ddcf40fb0b104fedc3b8dbcd98711ee4cb0ed
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 22:55:19 2012 -0700

    Parse negation.

      PS> -7
      -7
      PS> 1 + -7
      -6

commit 14b12bef33204c1b3f6059738a45b1ddfc35fa4e
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 22:08:58 2012 -0700

    TEST: REFACTOR: Extract Method in Ast tests

    Since we're doing the same thing over & over.

commit 4e786963402722b7f49430d71f070620e16e628b
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 22:04:40 2012 -0700

    implement array ranges

    Now you can do:
      PS> 1,3
      1..3
    but the output shows the type (`int[]`) not the values. Later.

commit 0f04b2410ea4b9b42190e176c333ad7821cc59ee
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 21:25:26 2012 -0700

    Typo in comment.

commit 121e4917937a5ac5dd822b25481dad7dbe74f378
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 21:19:50 2012 -0700

    Improve error reporting in `_node.Execute()`.

commit cf2d6d7dbed3b578d3ef7d2df861a6ea141f7c22
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 18:17:55 2012 -0700

    Remove old ASTNodes we don't need: ASTNode, AnyWordNode, CmdletNode, NonTerminalNode, ParamsListNode, ValueOfNode.

    I think all the functionality in these files is already working with the
    new parser, so we don't need them as a reference.

commit a876cea42fdf84b3ec2eb0ea9208429f408bf284
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 24 17:46:57 2012 -0700

    Expand parser to support command parameters.

    For example, this works:

        Set-Location C:\Windows

    In the process I got rid of `ASTNode.GetValue()` - everything goes through `Execute()`. See below for details.


    There are a couple regressions:

    - Prompt always gets a blank line. (See below)
    - `Set-Location` throws an object to the console ("System.Collections.ObjectModel.Collection`1[System.Management.Automation.PSObject]")


    Squashed commit of the following:

    commit af96ebb0abf8900c8a4c693eabb3395605333f9e
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 17:28:47 2012 -0700

        FORMATTING

    commit d049284e4729152b1946ddb763567299de57a1a5
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 17:28:31 2012 -0700

        Pass parameters to commands.

    commit 9f0770520ff72e221cd2fc292cd1d0a944dd32dc
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 14:36:21 2012 -0700

        `command_elements_node` to return `CommandParameter` objects

    commit c66357d4366262656baeaa10cbc5d3bdf328e4cb
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 14:34:37 2012 -0700

        Fix bug where we saw the parameters as part of the command name.

    commit 5b33214fa12302791df584a74231ca55f032e9c1
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Fri Aug 24 14:21:03 2012 -0700

        Get rid of `ASTNode.GetValue()`

        I don't think it is a good idea to distinguish between `GetValue()` and
        `Execute()`. Note that many. implementations of `Execute()` just called
        `GetValue()`.

        In PowerShell, you can evaluate any expression and still get side
        effects; you can perform any action and still get a result. Any
        expression can be a command; any command can include expressions. So I
        think that differentiating between them is a false abstraction. For
        example, consider:

        Set-Location (mkdir "x")

        Should we GetValue or Execute the mkdir?

        However, I may just not understand the reason for keeping them
        different. If that's the case, I hope I find out before I get too
        entrenched in this way of doing things. We'll see.

        I did introduce a regression. The prompt no longer prints in color, and
        has an incorrect newline at the end. I believe the correct fix is to run
        "prompt | write-host -nonewline", and to add
        $Host.UI.RawUI.ForegroundColor or write-host -foregroundcolor to the
        prompt implementation. Later.

    commit 1ab045f3ac1357ca5bcebb25c5fb3d3e72f7b1f2
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 23:56:58 2012 -0700

        REFACTOR: Use reflection to set `AstConfig` for `NonTerminal`s, too.

        Basically the same thing as Commit: 2329aeb, but that was for `Terminal`s.

    commit 1d21977ecdf2b7c76767c53d7013668200d94f4f
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 22:07:07 2012 -0700

        Add `command_elements_node`.

    commit 48bd9bccb2a00e1fdfea8fcae121e03147b630f7
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 21:50:13 2012 -0700

        Extend `ParametersTest()` all the way down the parse tree.

    commit d174dae15654c2677e837cc661b68563e6d482f3
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 21:31:44 2012 -0700

        Move parameter testing to grammar tests, not AST tests.

    commit 06ab782ac711a61320584d4da8c0729a92f2a48a
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 21:20:04 2012 -0700

        Move command logic from `command_name` to `command`.

        No user-visible impact, but not exactly a refactoring, either.

    commit 6df2b0dc673d9cd16a60a458aad146b2eb396e74
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 20:44:10 2012 -0700

        Parse command parameters (simple syntax only)

        That is:
            Set-Location C:\Windows

        and not:
            Set-Location -Path C:\Windows

    commit 6457bba61dc9ce1af1d1de60449996ad86035dcc
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 20:28:58 2012 -0700

        Remove extra parans from terminal regex patterns.

        These regex patters are composed from one another. I originally took the defensive approach of wrapping things with lots of parens:

            string pattern1 = "abc";
            string pattern2 = pattern1 + "+";             // PROBLEM: would match 'abcccc', but maybe it's supposed to match 'abcabc'
            string pattern2 = "(" + pattern1 + ")+";      // RESOLVED: Always put parens around things.

        A recent change added named groups to every sub-pattern:

            string pattern1 = "(?<pattern1>" + "abc" + ")"; // NEW!

        which means we can always assume a subpattern appears as a single group,
        so it's no longer necessary to wrap things with extra parens.

    commit fc4032451f4001a8ee144835e3894d50f32a7241
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 20:12:38 2012 -0700

        Remove old parser nodes that are already implemented in the new parser.

        We no longer need this code as a reference.

commit e09ca7ae846a08da2d499b3d47a7c32dc9d30493
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Thu Aug 23 18:52:30 2012 -0700

    update README history about parser

commit 92fbf6427766401858d3de461ab7ed842394e423
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Thu Aug 23 18:50:26 2012 -0700

    Parser to support decimal & hex numbers.

    Squashed commit of the following:

    commit 2329aebc833ec3395d476fe3a748f699a0c6001f
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 18:46:50 2012 -0700

        REFACTOR: Use reflection to set AstConfig.

        We were setting 4 the ugly way, so I decided it was bad enough to refactor.

    commit fa60abe56a92b3d8fedd8aa0ec634d1b960c98ec
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 18:30:34 2012 -0700

        Move `StringExtensions` to `Extension\String\`

    commit 1485a37f05e9c2d8b1cf43a8a998fe4767210cff
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 18:09:06 2012 -0700

        Comment change.

    commit 6511392b33dcd36833df841db314eb93866b5f5f
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 18:08:34 2012 -0700

        REFACTORING: Back off on use of query comprehension syntax

        It was just getting hard to read.

    commit 3fd16efec5430883da1149261ba20e5fde74c086
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 17:37:57 2012 -0700

        TEST: make sure `generic_token` is correcty set up for AST

        I'm getting ready to refactor the AST configuration a little.

    commit ed4f49dfd3c4ff885dd124f73cc3aaf5fc3ec0d1
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 17:08:03 2012 -0700

        Implment `hexadecimal_integer_literal_node`.

        Now we can parse and use hex integers, e.g.:

            PS> 0x10 + 2
            18

    commit 88cafcf25b1e54338b863c839c8f2e87395eda28
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 17:02:20 2012 -0700

        Make `CaseInsensitiveGrammar` actually case-insenstive!

        I had the flag backwards, *sigh*.

    commit cd1067dc919cdde87dcf531605174af30e79bbe1
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 13:28:07 2012 -0700

        TEST: Fix HEXIntegerLiteralTest

        Needed to supply `RexexOptions.IgnoreCase`, which Irony already does.

    commit ff4178d1e93f68d638a15c6dd85dc56c027df9bc
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 13:25:52 2012 -0700

        Move literal regexes in to productions.

        The problem was trying to write matching for integer literals, both hex
        and decimal. The pattern described in the spec looks like:

           ([0-9]+)|(0x[0-9a-z]+)

        The regex alternation operator `|` is not greedy, so when trying to match
        `0xa` it would just match `0`. One fix is to reorder the regex so the hex
        part comes before the decimal part, but that's a bit error prone. So
        instead I moved the responsibility from the scanner to the parser. I did
        that by moving the definitions of the following rules from the regex-based
        terminals to the rule-based grammar:

         - `literal`
         - `integer_literal`
         - `string_literal`
         - `real_literal`     # not yet implemented

        A consequence of this change is that the AST implementation is now much
        simpler. Previously `literal_node.GetValue()` had to figure out which
        sub-regex was the best match for this token, but now that's all done by the
        parser.

        hex integers and expandable strings are still not implemented in the AST;
        that's next.

    commit c576157df3d4f119036a84b255a50b998beae0df
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 12:36:34 2012 -0700

        Remove AST node types that did nothing.

        `_node` was abstract, but now it's just the default implementation.

        Many of these will be added back later, as needed.

    commit 7ae110825abb7c346241c3d27541b542e0c86277
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Thu Aug 23 12:15:40 2012 -0700

        Ensure regexes are greedy enough.

        I was having problems with regex terminals not matching enough. The old
        tests forced greed with ^...$, but that's not what the live parser does:
        it lets the regex match as much as it wants, and uses that.

    commit 629a6145e4013074e345661a1492b9f3f0028f3a
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 20:48:02 2012 -0700

        Implement recognition of `decimal_integer_literal`.

        This works:
            PS> 1
            1
            PS> 4 + 4
            8

    commit ecace4e806a5552de8cfd64ba25da4bd4d21c73a
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 19:43:24 2012 -0700

        Rank `generic_token` lower than all others.

        There is an ambiguity here:
            pipeline ::= expression | command

            expression ::= literal
            literal = integer_literal
            integer_literal = [0..9]+

            command ::= generic_token
            generic_token = Any Unicode character except:
                    {		}		(		)		;		,		|		&		$
                    `   (The backtick character U+0060)
                    double_quote_character
                    single_quote_character
                    whitespace
                    new_line_character

        A number (1234) can match either `expression` or `command`. I don't know why this isn't flagged by Irony - beyond
        my understanding/memory of parsing theory.

        Interestingly, PowerShell allows almost anything to be a command name. For example, this works:
            PS> Set-Alias + Get-Location
            PS> & +

        A Terminal has an integer priority. Given the choice between matching `generic_token` and `integer_literal`, I want the latter. In fact,
        I want `generic_token` to be a match of last resort. So I set its priorty to -1 (the default is 0).

        I couldn't find any discussion of this in the PowerShell Language Specification, but I might have missed it.

    commit 7661f720fcc3f52e7af59fb545f969b2d8c35e30
    Merge: 9e06408 96d52e2
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 17:12:12 2012 -0700

        Merge branch 'integrate-new-parser' into integrate-new-parser.numbers

    commit 9e06408bdb019a6502a0bcbec42995e4d2789fe7
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 09:30:27 2012 -0700

        Extend `literal_pattern` to allow decimal integers.

    commit b669e6e53ccfda1df468f2d5619fd95470b3b0f0
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 09:30:03 2012 -0700

        Mark `PowerShellGrammarLexicalPatternsTests` public

        NUnit will ignore non-public test fixtures, which makes it easy for
        tests to quietly disappear down a black hole. Arggg!

    commit 2e38f1d73b610432d9b31fbdf1bdb1f0e8d5a699
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 09:17:31 2012 -0700

        Parse decimals literals.

    commit 3b22be820e02d7a6119155fa89d17969e62b5b74
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 09:17:09 2012 -0700

        Some tests to aim for.

commit 96d52e2b88b4d07e97b9d2621b36df584b8a957a
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Wed Aug 22 17:11:26 2012 -0700

    Tests for GrammarErrorLevel. Currently passing at NoError.

commit 19260dac82c698c428f559026832beaac00ff1a6
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Wed Aug 22 08:28:10 2012 -0700

    Support for `(Get-Foo)`, like in the default prompt.

    Squashed commit of the following:

    commit c89f19e70e3b1286b4d6a1cff6b617dde31f25ff
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 08:27:30 2012 -0700

        scale back `ParenthesizedExpression` test

        I don't know a great way to test this in a unit test. Obviously some refactoring here would be good.

    commit c6db2ea838aac9fbba08c4eca946bb126b8435e2
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 08:21:29 2012 -0700

        Implement `command_name_node.GetValue`

        Now we can run a prompt that executes a cmdlet, like:
        'PS ' + (Get-ChildItem) + '> '

    commit 6ce56b44585d336d92dd07a216a6b68d993a358a
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 08:05:07 2012 -0700

        implemented param_expr.GetValue.

    commit 9eada69a9529b15f30fb68e4607b0ab33d9d2f7b
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 08:04:09 2012 -0700

        add `generic_token` to AST

    commit 2fd56279b76bf20049d286fa6a4946f4bc2b5c1e
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 08:03:06 2012 -0700

        richer diagnostics in `_node`

    commit 62c3ae21ebaaf23e3060d25801a4b3e840b53207
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 08:02:26 2012 -0700

        add generic_token_node, w/ possible impl

    commit 46faf128d73576ca20165224c19f908fba13e3e8
    Author: Jay Bazuzi <jay@bazuzi.com>
    Date:   Wed Aug 22 08:01:45 2012 -0700

        unit test to aim for.

commit 5dd86867ae462f03b82ead14cb8b190adc73ce12
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Wed Aug 22 00:56:17 2012 -0700

    Add `[DebuggerStepThrough]` to default `_node` methods.

    These are deeply recursive, so save us the debugging hassle.

commit dd283df4386867f1498c6d52c7f43b20abdb454f
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Wed Aug 22 00:53:00 2012 -0700

    AST now supports adding 2 verbatim string literals.

    You can open Pash and run:
      PS> 'x' + 'y'
      xy
    Yay!

commit 4d3562bdd45c8cb502c4e2d63fed53062e8b9116
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Wed Aug 22 00:42:50 2012 -0700

    AST can evaluate verbatim string literals.

    This is the first terminal in the AST.

    Includes test.

commit 1eab77482e4fb36537815921dbf3858d1d163ca7
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 23:58:14 2012 -0700

    Make default implementations of `_node.Execute` and `_node.GetValue`.

    If there's exactly one child, just delegate to that child.

commit 74570a1e1d5ce5fb9fd3009d29202e58bf1bc6bd
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 23:22:10 2012 -0700

    Name regex groups in Terminals

    this makes it easy to extract a specific element from the matched text.

    For example, a verbatim string literal can be delimited with 4 different
    types of quotes, and the rest of Pash shouldn't have to worry about
    figuring that out. Now you can just do a regex match & pull out groups
    by name.

    This should also be useful when making sense of more complex tokens,
    such as expandable strings.

commit ef96f68b90e30667edf200e9916e98695cd5ebfe
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 20:15:23 2012 -0700

    Actually build the AST.

    - Remove the automatic `TermFlags.NoAstNode`

    - `additive_expression.AstConfig.NodeType`

    - Write `_node.cstor`

    - ScriptProcessor: call `Execute` on AST.

    All `Execute` methods are NYI, so this doesn't actually work yet.

commit 80d3a8617113a3e8273b96f54dff2fc179f804a3
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 20:03:13 2012 -0700

    IRONY: Pass parameters to DefaultNodeCreator.

    This was a bug.

commit df29bf0cc41aff8c9a7de92c56d83618f4246c7e
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 18:33:17 2012 -0700

    Make `DefaultPromptExpressionsTest()` and `App.Config` match

    - Removed use of $() from app.config, since that's more syntax than I'm
    ready to support, and it wasn't necessary. ($() is more important within
    strings.)

    - Modified the test to use verbatim string literals, since they're easy to
    implement.

    - Added terminales to recognize verbatim string literals.

commit 6897137c967e99b9adf738bbd78941789d05f064
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 18:25:01 2012 -0700

    TEST: Remove unneeded newlines in test inputs

    These went in by mistake when I tried to fix the bug in the language
    spec around statement_list.

commit 36bcfbccbe498821c49c5edee2fc509588ef05d9
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 17:50:14 2012 -0700

    Missing edit, in .csproj.

commit ec77f0f311e6ab760a172860e9eddaaa0b4c9189
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 17:45:38 2012 -0700

    Set `AstConfig.NodeType` to every production rule.

    This is surely not correct for all nodes, but it's a bulk step in the
    (hopefully) right direction.

    The names are C-style (foo_bar_baz) instead of C# style (FooBarBaz) because
    of the way they were generated, based on the original language spec. Too
    bad.

commit b4db3c9e44bab813860b91dd427f3612f1ad80c0
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 17:00:23 2012 -0700

    IRONY: Make `DefaultAstNodeCreator` and `AstNodeCreator` the same.

    Previously, you could either set

       `AstNodeConfig.NodeType` to the type of the AST node (giving it a no-params ctor, and implementing IAstInit), or
       `AstNodeConfig.NodeCreator` to a delegate that would create the node, passing inputs to its ctor.

    Now both cases pass the inputs to the ctor.

commit 2cdce7af4cff69b4a5e73efeeb3df7cbe529660e
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 13:21:11 2012 -0700

    IRONY: REFACTOR: 1 more rename of ToTerm -> ToTerminal

commit d05553983485dfd539cffbb5298758cd0801d4ab
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 12:14:06 2012 -0700

    IRONY: Throw more useful exception when AST misconfigured

    If you set the flag to build an AST, but don't provide a method for
    creating the AST
    node, throw an exception that says which term is busted, instead of just
    crashing.

commit 5ccd1d2eb3ebf85cb509de6e1b99a802b385ddd6
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 11:02:22 2012 -0700

    IRONY: REFACTOR: More renames of KeyTerm -> KeywordTerminals

commit 423cedf4d8591bfa97be8f1c3e89f3e1d2fdd0b9
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 10:59:29 2012 -0700

    Verify the rest of the parse tree in DefaultPromptExpressionsTest

commit 029720d1558f55715b0668e163fe7a4a764ef005
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 10:38:42 2012 -0700

    REFACTOR: Rename KeyTerm/ToTerm -> KeywordTerminal/ToTerminal

    "Term" is a node in the BNF syntax, as in "BnfNode".

commit c082c8b390e8257f90adce3a5ddb7a1835d3816b
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 10:16:40 2012 -0700

    TESTS: REFACTOR: VerifyParseTreeSingles takes params

    Reorder the paramters to VerifyParseTreeSingles, and mark it `params`
    so it's easier to use.

commit 01e64f42d06ab2ad1d4dbb0169ad5346d91693d0
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 00:48:30 2012 -0700

    Build an AST, but don't.

    Tell the parser we want to build an AST, but mark every BnfTerm as NoAst.

commit a7f82ad9db6dd12c8b622aa7339a1b7144ba458a
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 00:47:38 2012 -0700

    TEST: set node count to account for the new transient nodes.

commit 4aa6a19dc07f3e68fb068f0933fa62302e3ce079
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 00:46:39 2012 -0700

    Build error: don't try to exectute the AST yet.

    Since we don't have one.

commit 99bbf12557ee7c690b252e309443751633f5e1b6
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 21 00:45:49 2012 -0700

    IRONY: When creating unnamed Terminals, mark them as transient.

    When a language grammar has an optional element:

        FOO ::= BAR BAZ_opt

    a common idom in Irony is to write:

        Foo.Rule = Bar + (Baz | Empty)

    BNF is strict that you can have an or-ed list of ands, but not an and-ed
    list of ors. So Irony rewrites the rule like this:

        Unnamed0.Rule = Baz | Empty
        Foo.Rule = Bar + Unnamed0

    that is, Irony invents a new rule, just for this purpose. That's a problem
    if you want to create an AST, as you have no way to tell Irony what AST
    node to create for this invented rule.

    With my change, these invented rules are marked "transient", which means
    they won't appear in the final parse tree, and won't affect the AST.

commit f029c6e0ac82e4ed2cc22c48f0b1c2628768527f
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Mon Aug 20 18:26:34 2012 -0700

    Comments explaining that these null-initialized fields are really reflection-initialized.

    Otherwise, it could be confusing to read - it looks like it should always be null!

commit 801159f81022962337e929260e46e09e8365c55d
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Mon Aug 20 12:54:05 2012 -0700

    Irony: Prefer `struct` of `bool`s over `enum` - `LanguageFlags`.

    Bit manipulation is error-prone, and is unlikely to result in any
    performance benefit.

commit 97bcecdfc76a601bf0b1b088754df976e6cf9247
Merge: c6d06f0 a6364f4
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 22:22:26 2012 -0700

    Merge branch 'master' into integrate-new-parser

commit c6d06f0956f824a05a2ee4877aa6c65516daad1f
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 21:13:35 2012 -0700

    Replace GOLD Parser with Irony-based PowerShell parser.

    - Rip out Gold Parser
    - Copy in Irony-based parser
    - Fix namespaces, using directives.

    It doesn't run.

commit 455076e5486176fe7b5c3d46729c6922fd45f5e6
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 20:42:02 2012 -0700

    Initialize [Non]Terminal fields to null, to suppress warnings.

commit ce55486e6e4b065704a40485b64fcd23abb6dac7
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 20:28:21 2012 -0700

    Parse simple prompt: "PS> " + (Get-ChildItem)

    This means we now support:
       addition
       strings
       parentheses

    Note an apparent bug + workaround in the spec, documented in comments.
    Workaround means you can't do this:

        if ($true) {} "Hello"

commit 2aa2dca38d22f644c73e0024578553808e3a08d5
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 19:57:47 2012 -0700

    Remove extranious terminal that wasn't in the spec. We don't use it now, so forget about it.

commit bf46095c5ce994f84f103b0de6bee6b573ab7fc2
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 19:57:24 2012 -0700

    Use Unicode escape codes, not actual characters, in the regexes.

    This makes reading the resulting regex a little easier. For example, a
    newline won't look like a blank line, but like "\u000A\u000D".

    Since escaping strings is a little tough to read, I made any string that
    uses a backslash in to a verbatim string literal, for less escaping.

commit af939b3bd89606c142ef318577387bb2cb2df855
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 19:53:40 2012 -0700

    Fix generic_token test to actually offer a string in PowerShell syntax.

commit 420ee6a49abf39bf6cadf58675ca2e975fbe761e
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 18:52:48 2012 -0700

    Detailed logging when parse trees don't match.

commit a76f04c7374e4d0e3492478539da80ee7954f4ea
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 18:31:19 2012 -0700

    TEST: Make sure generic_token doesn't match a string.

commit de565d38aaaa954f24f2b10cbe2c01dfb0a60364
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 18:22:58 2012 -0700

    REFACTOR: Extract Method to verify simple parse trees in tests

    This is just for sequences of nodes with only 1 child each.

commit 85001c921a04bce69996b3dda77d63b7911bf23e
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 17:33:21 2012 -0700

    Remove terminals that we don't actually use.

    I just realized that the syntactic grammar doesn't use the entire lexical
    grammar, just bits and pieces of it. So we don't need the `token`
    terminal, for example.

commit 345fc92c5980c9d8c84f222df19dfe5605374ffb
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 16:52:04 2012 -0700

    Parse trivial prompt ("PS> ")

commit 45d4123fa9272327565f8fc6f3e0b759f350e651
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 15:26:47 2012 -0700

    FORMATTING: whitespace between regions

commit d6a95838e784434b2bdbfcb972dd82bd2f3c967e
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 11:00:59 2012 -0700

    Expose token patterns as `RegexBasedTerminal` instead of a `string`

    This is basically a refactoring to move away from the primitive type,
    but it also has the important effect of making the `Terminal`s in to
    singletons, so they can be reused and compared as needed, and so we
    have a good name to pass in to the `RegexBasedTerminal`.

    `RegexBasedTerminal` takes both a rule name and a pattern in its ctor.
    The rule name is a duplicate of the field name, but DRY. To make the
    reflection work out, I store the pattern in one field, and then
    construct the object at runtime.

    The current code only works if all the terminals are
    `RegexBasedTerminal`s. If we decide we want to use another type of
    terminal, we'll need to deal with that.

commit 50911a5e74cc119c1a42b815b7d83eb6e6bf1e69
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 10:35:15 2012 -0700

    comment about StringExtensions.JoinString

commit 058a1070a3a5288a11ab4974ba43f4ccbc13b4c8
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sun Aug 19 08:14:07 2012 -0700

    Verify contents of parse tree for trivial case.

commit a48896114568414db9d3534b15fc4862c0931835
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sat Aug 18 23:17:55 2012 -0700

    Variations on the grammar for the 4 different input types.

commit 5c8c7de3a78c38a92879cdc70eb743c90c573e13
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sat Aug 18 23:09:06 2012 -0700

    Define production rules sufficient to parse a trivial command.

commit bbc654976dacb3928ffefa3b21b9471b6ab55900
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Sat Aug 18 22:55:43 2012 -0700

    add Irony.Parser exceptions

    Some exceptions to help me understand why this code was crashing.

commit 8cb4ab33266a7c45d86f464d21434b88e745cf33
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 23:56:58 2012 -0700

    HasErrors should be a property.

commit d4a366cb302e77b2729b7ab2e676b6e8c81855f9
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 23:56:05 2012 -0700

    Add string.Join() to StringExtensions.

commit 7a17e2875917c24dab0a91bf14ef69d030877e84
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 23:33:58 2012 -0700

    InitializeNonTerminals: verifiy we're not overwriting fields

    This can happen if you write a field initializer.

commit 0fcf4791e6e534293f7e3ef08a62623ce53b4b6a
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 23:32:35 2012 -0700

    Delegate initializing grammar rules to a new method, so we don't accidentally overwrite a readonly field.

commit fa066f5825a457472b53073063f0c8c83380e332
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 23:28:52 2012 -0700

    Remove duplicated primary_expression.

    This probably happened due to word wrapping in the original spec.

commit 9da7b8a1823df55be11a79007491c3505d31673a
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 23:26:22 2012 -0700

    Declare NonTerminal fields for all rules.

commit ab1db92dc3b5822978d97ddbbd67441bceaa87f2
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 22:36:51 2012 -0700

    Automatically initialize nonterminals.

commit a08223d488d867a0fbacdb04cb8ae1bfcba73af8
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 22:17:24 2012 -0700

    test for GenericToken

commit 1f00980ec01d31688fb8212a2aedf276aa376da2
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 21:56:54 2012 -0700

    name tests without 'test' to make names easier to read

commit 81b73a0c592fc117dd352f97f801c1df836859be
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 21:55:28 2012 -0700

    remove extra parens we don't need

commit 26e17e8c0c916cc72d080679a8415b82cb7e92dc
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 21:54:19 2012 -0700

    Test & fix PowerShellGrammar.LexicalPatterns.generic_token_char

    I need to be able to declare character sets:

    whitespace = "[\\p{Zs}\\p{Zl}\\p{Zp}\u0009\u000B\u000C]";

    and compose them:

    generic_token_char = "([^" + @"\{\}\(\)\;\,\|\&\$" + whitespace + "])";

    so I am creating some of them in pairs as needed:

    whitespace_ = "\\p{Zs}\\p{Zl}\\p{Zp}\u0009\u000B\u000C";
    whitespace = "[" + whitespace_ + "]";

commit 57564353a4999b6e5767867b3606c5ba1d8f8cc3
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 21:04:00 2012 -0700

    Split lex patterns in to their own file

commit d58c17e2b4009c0f1fbd63c71dd1e845fa0f022f
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 20:53:05 2012 -0700

    minimal lex patters compile

commit d2c9b20564050a8899e8bb3f467123ef46915b06
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 20:43:13 2012 -0700

    typo

commit 7f8a21bd22be1bda5be2f4cbc3177de928a551ce
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 17:31:30 2012 -0700

    dash -> underscore in token names. Define 'command', 'generic_token_part', 'generic_token_char', 'colon'

commit 7d2d5bdc85304e881c56ed77096a3ba28259bcc3
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 16:39:31 2012 -0700

    define 'token'

commit 145c2384d000d9505cae433672a29658189b60cc
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 15:25:05 2012 -0700

    define 'whitespace'

commit a566039e66ae8219b38bcdf5299a1c8d249835f2
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 15:21:11 2012 -0700

    define 'new_line_character'

commit 1b5e2f18135a0986b21b906596962a781207b10c
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 15:18:57 2012 -0700

    patterns in a static class

commit a9974f21c5e2db8ca1f23fa0c95378117892adc0
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 15:18:18 2012 -0700

    define 'input' as const

commit 8d1e27195f00e1cf92a7d7eb6ffe9d96fdbe1d7d
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 13:18:32 2012 -0700

    StringExtensions

commit 6b9528274d39de41e3578d28b48dee89c4fa17c8
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Fri Aug 17 12:52:26 2012 -0700

    Full grammar, in a comment.

commit 5f7a5aa09260508ae4b11401010b6d171a37ea50
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Wed Aug 15 14:41:18 2012 -0700

    Automatically run nunit on build

commit 239b98d6e2f5ee78bc7bc0b263b065769ffc55ab
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Wed Aug 15 14:37:02 2012 -0700

    Fix PashGui builder under Visual Studio

    Getting the right NUnit reference was all it took.

commit 173bcd644fb6970e48d5b386e946050bd6f78394
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 15:34:17 2012 -0700

    REFACTOR: Move CaseInsensitiveGrammar to its own file.

commit d8619713d1bdf30954a94e3db0ed42433b1e00a7
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 15:33:54 2012 -0700

    Fix namespace & assembly name

commit 023bd6204c04adcc3abc78b2aa36b4baacae78aa
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 15:30:43 2012 -0700

    Trivial: add comment

commit a02ec0d2d1453a323992763ba74ec567b0570cfd
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 15:03:37 2012 -0700

    Add an assert to CreateParserTest, mostly to quiet the warning.

commit fceb14455b75957026eef6616a9fee81176d6a09
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 14:56:14 2012 -0700

    REFACTOR: Extract Class CaseInsensitiveGrammar

commit 5220b808c48524e12998cb1e72e0934c6cc7b50d
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 14:53:22 2012 -0700

    Mark parser as case-insensitive

commit 43bb5b48ca30cedf812c292b1ce0785f6e1a40d0
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 14:46:08 2012 -0700

    Create parser object

commit bca6f9afa1c86399e960809adafd9ae2cced8eda
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 14:42:51 2012 -0700

    ignore Test-Results/

    these are created by NUnit.

commit a288f3ba6d14b935e0292cfa9e3a37392ea2a7e2
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 14:36:14 2012 -0700

    Create trivial tests

    One pass, and one fail, to confirm that these things are working.

commit 88de3ec9cdfea86aaf713c6607a0915d37c9e52b
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Tue Aug 14 14:19:06 2012 -0700

    Create ParserTests project

commit b52f0a95bb271744d248717130200744439f1cfa
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Mon Aug 13 23:41:02 2012 -0700

    Add Irony to Pash solution.

    Most of the changes are automatically generated by MonoDevelop, but the one thing I had to do by hand was edit the options for the Irony project to set the target framework to Mono.

commit 6485e9e9bb17e3555f45828bbdaa200d2185e9ca
Author: Jay Bazuzi <jay@bazuzi.com>
Date:   Mon Aug 13 23:26:06 2012 -0700

    Snapshot Irony parser

    Downloaded from from http://irony.codeplex.com/releases/view/8499

    Only grabbed the parser project; discarded the rest.