- #============================================================= -*-Perl-*-
- #
- # Lemplate::Grammar
- #
- # DESCRIPTION
- # Grammar file for the Template Toolkit language containing token
- # definitions and parser state/rules tables generated by Parse::Yapp.
- #
- # AUTHOR
- # Ingy döt Net <ingy@cpan.org>
- #
- # ORIGINAL AUTHOR
- # Andy Wardley <abw@kfs.org>
- #
- # COPYRIGHT
- # Copyright (C) 2006-2008 Ingy döt Net.
- # Copyright (C) 1996-2000 Andy Wardley.
- # Copyright (C) 1998-2000 Canon Research Centre Europe Ltd.
- #
- # This module is free software; you can redistribute it and/or
- # modify it under the same terms as Perl itself.
- #
- #------------------------------------------------------------------------
- #
- # NOTE: this module is constructed from the parser/Grammar.pm.skel
- # file by running the parser/yc script. You only need to do this if
- # you have modified the grammar in the parser/Parser.yp file and need
- # to-recompile it. See the README in the 'parser' directory for more
- # information (sub-directory of the Lemplate distribution).
- #
- #========================================================================
- package Lemplate::Grammar;
- require 5.004;
- use strict;
- use vars qw( $VERSION );
- $VERSION = sprintf("%d.%02d", q$Revision: 2.10 $ =~ /(\d+)\.(\d+)/);
- my (@RESERVED, %CMPOP, $LEXTABLE, $RULES, $STATES);
- my ($factory, $rawstart);
- #========================================================================
- # Reserved words, comparison and binary operators
- #========================================================================
- @RESERVED = qw(
- GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER BLOCK END
- USE RAW PLUGIN FILTER MACRO JAVASCRIPT TO STEP AND OR NOT DIV MOD
- IF UNLESS ELSE ELSIF FOR NEXT WHILE SWITCH CASE META IN
- TRY THROW CATCH FINAL LAST RETURN STOP CLEAR VIEW DEBUG
- );
- # for historical reasons, != and == are converted to ne and eq to perform
- # stringwise comparison (mainly because it doesn't generate "non-numerical
- # comparison" warnings which != and == can) but the others (e.g. < > <= >=)
- # are not converted to their stringwise equivalents. I added 'gt' et al,
- # briefly for v2.04d and then took them out again in 2.04e.
- %CMPOP = qw(
- != ~=
- == ==
- < <
- > >
- >= >=
- <= <=
- );
- #========================================================================
- # Lexer Token Table
- #========================================================================
- # lookup table used by lexer is initialised with special-cases
- $LEXTABLE = {
- 'FOREACH' => 'FOR',
- 'BREAK' => 'LAST',
- '&&' => 'AND',
- '||' => 'OR',
- '!' => 'NOT',
- '|' => 'FILTER',
- '.' => 'DOT',
- '_' => 'CAT',
- '..' => 'TO',
- # ':' => 'MACRO',
- '=' => 'ASSIGN',
- '=>' => 'ASSIGN',
- # '->' => 'ARROW',
- ',' => 'COMMA',
- '\\' => 'REF',
- 'and' => 'AND', # explicitly specified so that qw( and or
- 'or' => 'OR', # not ) can always be used in lower case,
- 'not' => 'NOT', # regardless of ANYCASE flag
- 'mod' => 'MOD',
- 'div' => 'DIV',
- };
- # localise the temporary variables needed to complete lexer table
- {
- # my @tokens = qw< ( ) [ ] { } ${ $ / ; : ? >;
- my @tokens = qw< ( ) [ ] { } ${ $ + / ; : ? >;
- my @cmpop = keys %CMPOP;
- # my @binop = qw( + - * % ); # '/' above, in @tokens
- my @binop = qw( - * % ); # '+' and '/' above, in @tokens
- # fill lexer table, slice by slice, with reserved words and operators
- @$LEXTABLE{ @RESERVED, @cmpop, @binop, @tokens }
- = ( @RESERVED, ('CMPOP') x @cmpop, ('BINOP') x @binop, @tokens );
- }
- #========================================================================
- # CLASS METHODS
- #========================================================================
- sub new {
- my $class = shift;
- bless {
- LEXTABLE => $LEXTABLE,
- STATES => $STATES,
- RULES => $RULES,
- }, $class;
- }
- # update method to set package-scoped $factory lexical
- sub install_factory {
- my ($self, $new_factory) = @_;
- $factory = $new_factory;
- }
- #========================================================================
- # States
- #========================================================================
- $STATES = <<$states>>;
- #========================================================================
- # Rules
- #========================================================================
- $RULES = <<$rules>>;
- 1;