The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
##
# name:      Pegex::Crontab::Grammar
# abstract:  Pegex Crontab Parser
# author:    Ingy döt Net <ingy@cpan.org>
# license:   perl
# copyright: 2011

package Pegex::Crontab::Grammar;
use Pegex::Base;
extends 'Pegex::Grammar';

use constant file => '../crontab-pgx/crontab.pgx';

sub make_tree {
  {
    '+toprule' => 'crontab',
    'EOL' => {
      '.rgx' => qr/\G\r?\n/
    },
    'blank_line' => {
      '.rgx' => qr/\G[\ \t]*\r?\n/
    },
    'command' => {
      '.rgx' => qr/\G(.*)/
    },
    'comment_line' => {
      '.rgx' => qr/\G[\ \t]*\#.*\r?\n/
    },
    'cron_line' => {
      '.all' => [
        {
          '.ref' => 'minute'
        },
        {
          '.rgx' => qr/\G\s+/
        },
        {
          '.ref' => 'hour'
        },
        {
          '.rgx' => qr/\G\s+/
        },
        {
          '.ref' => 'dom'
        },
        {
          '.rgx' => qr/\G\s+/
        },
        {
          '.ref' => 'month'
        },
        {
          '.rgx' => qr/\G\s+/
        },
        {
          '.ref' => 'dow'
        },
        {
          '.rgx' => qr/\G\s+/
        },
        {
          '.ref' => 'command'
        },
        {
          '.ref' => 'EOL'
        }
      ]
    },
    'crontab' => {
      '+min' => 0,
      '.any' => [
        {
          '.ref' => 'comment_line'
        },
        {
          '.ref' => 'blank_line'
        },
        {
          '.ref' => 'env_line'
        },
        {
          '.ref' => 'cron_line'
        }
      ]
    },
    'day' => {
      '.rgx' => qr/\G(mon|tue|wed|thu|fri|sat|sun)/
    },
    'dom' => {
      '.ref' => 'time'
    },
    'dow' => {
      '.ref' => 'time'
    },
    'env_line' => {
      '.all' => [
        {
          '.ref' => 'variable'
        },
        {
          '.rgx' => qr/\G=/
        },
        {
          '.ref' => 'value'
        },
        {
          '.ref' => 'EOL'
        }
      ]
    },
    'hour' => {
      '.ref' => 'time'
    },
    'minute' => {
      '.ref' => 'time'
    },
    'month' => {
      '.ref' => 'time'
    },
    'number' => {
      '.rgx' => qr/\G([0-9][0-9]?)/
    },
    'range' => {
      '.all' => [
        {
          '.ref' => 'number'
        },
        {
          '.rgx' => qr/\G\-/
        },
        {
          '.ref' => 'number'
        },
        {
          '+max' => 1,
          '.all' => [
            {
              '.rgx' => qr/\G\//
            },
            {
              '.ref' => 'number'
            }
          ]
        }
      ]
    },
    'star' => {
      '.rgx' => qr/\G(\*)/
    },
    'time' => {
      '.any' => [
        {
          '.ref' => 'star'
        },
        {
          '.ref' => 'number'
        },
        {
          '.ref' => 'range'
        },
        {
          '.ref' => 'day'
        }
      ]
    },
    'value' => {
      '.rgx' => qr/\G(.*)/
    },
    'variable' => {
      '.rgx' => qr/\G(\w+)/
    }
  }
}

1;