# DEV NOTE: DO NOT RUN PERLTIDY ON THIS FILE! this is EYAPP syntax, not pure Perl syntax
%{
use strict;
use warnings;
our $VERSION = 0.001_004;
use Carp;
use rperlrules; # affirmative, it totally does
%}
%strict # require all tokens to be declared, etc.
%tree # automatically create AST
%whites /((?:\s*(?:[#][^#!].*)?\s*)*)/ # actual whitespace, or one or more normal comments; neither shebang '#!', nor double-hash critics '##'
%defaultaction {
my $self = shift;
my $name = $self->YYName();
bless { children => [ @_ ] }, $name;
}
%token SHEBANG = /(^#!\/(?:\w+\/)*perl)/ # begin line, hash (octothorpe), bang, *NIX path to Perl; ex. '#!/usr/bin/perl'
%token VERSION_NUMBER_ASSIGN = /\$VERSION\ =\ (\d\d?\.\d{3}\_\d{3});/ # DEV NOTE, CORRELATION #14: $VERSION assign v-number, only capture v-number, not a normal number; ex. '$VERSION = 12.345_678;' returns '12.345_678'
%token MY = /(my)/ # 'my'
%token LITERAL_NUMBER = /(-?(((\d{1,2}_)?(\d{3}_)*\d{3})|\d{1,2})(\.((\d{3}(_\d{3})*(_\d{1,2})?)|\d{1,2}))?)/ # number w/ underscores; ex. '12_345_678.910_1'
%token LITERAL_STRING = /(('[^']+')|("[^"\@\$]*((\\n)|(\\t))+[^"\@\$]*")|(q\{[^}]*\}))/ # single quotes non-empty; double quotes non-empty w/out sigils & w/ newline or tab; or single q-braces
%token VARIABLE_SYMBOL = /(\$(?:[a-zA-Z]\w*)?[a-z]\w*(::[a-zA-Z]\w*)*)/ # dollar sigil, scoped word with at least one lowercase in the first scope segment
%token FHREF_SYMBOL_BRACES = /(\{\$[A-Z][A-Z0-9_]*\})/ # left brace, dollar sigil, uppercase letter, uppercase letters & numbers & underscores, right brace; ex. '{$MY_FILEHANDLE_23}'
%token FHREF_SYMBOL = /(\$[A-Z][A-Z0-9_]*)/ # dollar sigil, uppercase letter, uppercase letters & numbers & underscores; ex. '$MY_FILEHANDLE_23'
%token TYPE_INTEGER = /(integer)\s+/ # 'integer' followed by whitespace
%token TYPE_FHREF = /(filehandleref\s+)/ # 'filehandleref' followed by whitespace
%token TYPE_METHOD = /([a-zA-Z]\w*_method)/ # letter followed by letters, numbers, and underscores, followed by '_method'; ex. 'string_arrayref_method'
%token WORD_SCOPED = /((?:[a-zA-Z]\w*)?(?:::[a-zA-Z]\w*)+)/
%token TYPE_SELF = /(object\s+\$self)/ # 'object $self'
%token STDOUT_STDERR = /(\{\*STDOUT\}|\{\*STDERR\})/ # '{*STDOUT}' or '{*STDERR}'
%token STDIN = /(<STDIN>)/ # '<STDIN>'
# FEATURE BOUNTY #000, 1_000 CodeCoin: Implement all Perl functions AKA builtins (PERLOPS_PERLTYPES) as C++ functions (CPPOPS_*TYPES)
# Affects OP01_NAMED, OP01_NAMED_VOID, and OP10_NAMED_UNARY below, corresponding RPerl::Test::Operator* and C++ code; http://perldoc.perl.org/perlfunc.html
# PRECEDENCE, LEXICAL ORDERING: earlier declaration gets tried first; http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity [1]
# DEV NOTE: tokens which are all letters (or, ne, x, print, open, ETC) & are always followed by whitespace when tidy (NOT not or argumentless next, last, croak, return, exit, chdir, etc)
# must be explicitly made to match the trailing whitespace in the regular expressions below, in order to avoid incorrectly matching substrings of user-defined words
%token OP24_LOGICAL_OR_XOR = /(or|xor)\s/ # precedence 24 infix: logical or and xor, equivalent to || except for precedence
%token OP23_LOGICAL_AND = /(and)\s/ # precedence 23 infix: logical and, equivalent to && except for precedence
%token OP22_LOGICAL_NEG = /(not)/ # precedence 22 prefix: logical negation, equivalent to ! except for precedence
%token OP21_LIST_COMMA = /(,)/ # precedence 21 infix: "list operators (rightward)" [1] AKA comma
%token OP20_HASH_FATARROW = /(=>)/ # precedence 20 infix: hash entry fat arrow AKA fat comma
%token OP19_LOOP_CONTROL_SCOLON = /(next;|last;)/ # precedence 19 prefix void: loop control next, last
%token OP19_LOOP_CONTROL = /(next|last)\s/ # precedence 19 prefix void: same as above, except accepts loop label
%token OP18_TERNARY = /(\?)/ # precedence 18 infix: ternary conditional
%token OP17_LIST_RANGE = /(\.\.)/ # precedence 17 infix: range
%token OP16_LOGICAL_OR = /(\|\|)/ # precedence 16 infix: logical or
%token OP15_LOGICAL_AND = /(&&)/ # precedence 15 infix: logical and
%token OP14_BITWISE_OR_XOR = /(\||\^)/ # precedence 14 infix: bitwise or, bitwise xor
%token OP13_BITWISE_AND = /(&)/ # precedence 13 infix: bitwise and
%token OP12_COMPARE_EQ_NE = /(==|!=|eq|ne)\s/ # precedence 12 infix: comparison numeric equal, numeric not equal, string equal, string not equal
%token OP09_BITWISE_SHIFT = /(<<|>>)/ # precedence 09 infix: bitwise shift left, shift right
%token OP10_NAMED_UNARY = /(chdir|rand|scalar[^t])/ # precedence 10 prefix: "named unary operators" [1]; ex. 'chdir' and 'rand'; 'scalar' not 'scalartype'
%token OP19_VARIABLE_ASSIGN_BY = /(\+=|-=|\*=|\/=|\.=)/ # precedence 19 infix: add assign, subtract assign, multiply assign, divide assign, cat assign
%token OP08_STRING_CAT = /(\.)/ # precedence 08 infix: string concatenate
%token OP03_MATH_INC_DEC = /(\+\+|--)/ # precedence 03 prefix and postfix: increment, decrement
%token OP04_MATH_POW = /(\*\*)/ # precedence 04 infix: arithmetic exponent AKA power
%token OP07_MATH_MULT_DIV_MOD = /(\*|\/|\%)/ # precedence 07 infix: arithmetic multiply, divide, modulo
%token OP07_STRING_REPEAT = /(x)\s/ # precedence 07 infix: string repetition
%token OP06_REGEX_PATTERN = /([ms]\/.*(?:\/.*)?\/[a-z]*)/ # precedence 06 infix: regular expression pattern
%token OP06_REGEX_MATCH = /(=\~|!\~)/ # precedence 06 infix: regular expression match, not match
%token OP05_LOGICAL_NEG = /(!)/ # precedence 05 prefix: logical negation
%token OP02_HASH_THINARROW = /(->\{)/ # precedence 02 infix: thin arrow, hash dereference and retrieval
%token OP02_ARRAY_THINARROW = /(->\[)/ # precedence 02 infix: thin arrow, array dereference and retrieval
%token OP02_METHOD_THINARROW_NEW = /(->new\()/ # precedence 02 infix: thin arrow, class constructor
%token OP02_METHOD_THINARROW = /(->[a-zA-Z]\w*)/ # precedence 02 infix: thin arrow, method dereference and call
%token OP05_MATH_NEG_LPAREN = /(-\()/ # precedence 05 prefix: arithmetic negative
%token OP08_MATH_ADD_SUB = /(\+|-)/ # precedence 08 infix: arithmetic add, subtract
%token OP11_COMPARE_LT_GT = /(<=|>=|<|>|lt|gt|le|ge)\s/ # precedence 11 infix: comparison less than, greater than, less or equal, greater or equal
%token OP19_VARIABLE_ASSIGN = /(=)/ # precedence 19 infix: assign
%token OP01_PRINT = /(print|printf)\s/ # precedence 01 prefix void: print to STDOUT, STDERR, or filehandle
%token OP01_NAMED_VOID_SCOLON = /(croak;|die;|exit;|return;)/ # precedence 01 prefix void: "terms and list operators (leftward)" [1] AKA builtins, no return value
%token OP01_NAMED_VOID_LPAREN = /(croak\(|exit\(|return\()/ # precedence 01 prefix void: same as above, except w/ parenthesis; ProhibitParensWithBuiltins excepts return() & exit(...); RequireTidyCode & RequireCarping excepts croak()
%token OP01_NAMED_VOID = /(croak|die|exit|return)\s/ # precedence 01 prefix void: same as above, except accepts argument(s)
%token OP01_QW = /(qw\()/ # precedence 01 prefix: quoted words
%token OP01_OPEN = /(open)\s/ # precedence 01 prefix: open filehandle
%token OP01_CLOSE = /(close)\s/ # precedence 01 prefix: close filehandle
%token OP01_NAMED = /(sin|cos|push|pop|keys|values|sort|length|fakebuiltin)\s/
# precedence 01 prefix: "terms and list operators (leftward)" [1] AKA builtins
# PRECEDENCE, SYNTAX ASSOCIATIVITY: later declaration gets higher priority
%left OP24_LOGICAL_OR_XOR
%left OP23_LOGICAL_AND
%right OP22_LOGICAL_NEG
%left OP21_LIST_COMMA
%left OP20_HASH_FATARROW
%right OP19_LOOP_CONTROL_SCOLON
%right OP19_LOOP_CONTROL
%right OP19_VARIABLE_ASSIGN_BY
%right OP19_VARIABLE_ASSIGN
%right OP18_TERNARY
%nonassoc OP17_LIST_RANGE
%left OP16_LOGICAL_OR
%left OP15_LOGICAL_AND
%left OP14_BITWISE_OR_XOR
%left OP13_BITWISE_AND
%nonassoc OP12_COMPARE_EQ_NE
%nonassoc OP11_COMPARE_LT_GT
%nonassoc OP10_NAMED_UNARY
%left OP09_BITWISE_SHIFT
%left OP08_STRING_CAT
%left OP08_MATH_ADD_SUB
%left OP07_MATH_MULT_DIV_MOD
%left OP07_STRING_REPEAT
%left OP06_REGEX_MATCH
%left OP06_REGEX_PATTERN
%right OP05_MATH_NEG_LPAREN
%right OP05_LOGICAL_NEG
%right OP04_MATH_POW
%nonassoc OP03_MATH_INC_DEC
%left OP02_HASH_THINARROW
%left OP02_ARRAY_THINARROW
%left OP02_METHOD_THINARROW_NEW
%left OP02_METHOD_THINARROW
%left OP01_NAMED
%left OP01_CLOSE
%left OP01_OPEN
%left OP01_QW
%left OP01_NAMED_VOID_SCOLON
%left OP01_NAMED_VOID_LPAREN
%left OP01_NAMED_VOID
%left OP01_PRINT
%token WORD = /([a-z]\w*|[A-Z]\w*[a-z]\w*)/ # lowercase letter followed by optional word characters; or uppercase letter followed by at least one lowercase letter and optional word characters
%token WORD_UPPERCASE = /([A-Z][A-Z0-9_]*|[A-Z])/ # single uppercase letter, or uppercase letter followed by uppercase letters, numbers, and underscores; ex. 'FOOBAR_42_HOWDY'
%token COLON = /(:)/
%token LPAREN_MY = /(\(\s*my)/
%token LPAREN = /(\()/
%token LBRACKET = /(\[)/
%token LBRACE = /(\{)/
%%
CompileUnit: Program | (ModuleHeader Module)+ ;
Program: SHEBANG Critic? Header Critic* Include* Constant* Subroutine* Operation+ ;
ModuleHeader: Critic? 'package' WordScoped ';' Header ;
Module: Package | Class ;
Package: Critic* Include* Constant* Subroutine+ LITERAL_NUMBER ';' ;
Header: 'use strict;' 'use warnings;' 'use RPerl;' 'our' VERSION_NUMBER_ASSIGN;
Critic: '## no critic qw(' WORD+ ')';
Include: 'use' WordScoped ';' | 'use' WordScoped OP01_QW WORD+ ')' ';' ;
Constant: 'use constant' WORD_UPPERCASE OP20_HASH_FATARROW TypeInnerConstant Literal ';' ;
#Constant: 'use constant' WORD_UPPERCASE OP20_HASH_FATARROW TypeInnerConstant ConstantValue ';' ; # NEED UPGRADE: constant array & hash refs not read-only as of Perl v5.20
#ConstantValue: Literal | LBRACKET TypeInnerConstant? Literal (OP21_LIST_COMMA TypeInnerConstant? Literal)* ']' |
# LBRACE WORD_UPPERCASE OP20_HASH_FATARROW TypeInnerConstant? Literal (OP21_LIST_COMMA WORD_UPPERCASE OP20_HASH_FATARROW TypeInnerConstant? Literal)* '}' ;
Subroutine: 'our' Type VARIABLE_SYMBOL '= sub {' SubroutineArguments? Operation* '}' ';' ;
SubroutineArguments: LPAREN_MY Type VARIABLE_SYMBOL (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)* ')' OP19_VARIABLE_ASSIGN '@_;' ;
Class: 'use parent qw(' WordScoped ')' ';' Include Critic* Include* Constant* Properties MethodOrSubroutine* LITERAL_NUMBER ';' ;
Properties: 'our hashref $properties' OP19_VARIABLE_ASSIGN LBRACE HashEntryTyped (OP21_LIST_COMMA HashEntryTyped)* '}' ';' |
'our hashref $properties' OP19_VARIABLE_ASSIGN LBRACE '}' ';' ;
Method: 'our' TYPE_METHOD VARIABLE_SYMBOL '= sub {' MethodArguments? Operation* '}' ';' ;
MethodArguments: LPAREN_MY TYPE_SELF (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)* ')' OP19_VARIABLE_ASSIGN '@_;' ;
MethodOrSubroutine: Method | Subroutine;
Operation: Expression ';' | Statement ;
Operator: LPAREN OP01_PRINT FHREF_SYMBOL_BRACES ListElements ')' |
OP01_NAMED SubExpression | LPAREN OP01_NAMED ListElement OP21_LIST_COMMA ListElements ')' |
OP01_OPEN MY TYPE_FHREF FHREF_SYMBOL OP21_LIST_COMMA LITERAL_STRING OP21_LIST_COMMA SubExpression |
OP01_CLOSE FHREF_SYMBOL | OP03_MATH_INC_DEC Variable | Variable OP03_MATH_INC_DEC | SubExpression OP04_MATH_POW SubExpression |
OP05_LOGICAL_NEG SubExpression | OP05_MATH_NEG_LPAREN SubExpression ')' | SubExpression OP06_REGEX_MATCH OP06_REGEX_PATTERN |
SubExpression OP07_STRING_REPEAT SubExpression | SubExpression OP07_MATH_MULT_DIV_MOD SubExpression |
SubExpression OP08_MATH_ADD_SUB SubExpression | SubExpression OP08_STRING_CAT SubExpression | SubExpression OP09_BITWISE_SHIFT SubExpression |
OP10_NAMED_UNARY SubExpression | OP10_NAMED_UNARY | SubExpression OP11_COMPARE_LT_GT SubExpression |
SubExpression OP12_COMPARE_EQ_NE SubExpression | SubExpression OP13_BITWISE_AND SubExpression |
SubExpression OP14_BITWISE_OR_XOR SubExpression | SubExpression OP15_LOGICAL_AND SubExpression | SubExpression OP16_LOGICAL_OR SubExpression |
SubExpression OP17_LIST_RANGE SubExpression | SubExpression OP18_TERNARY VariableOrLiteral COLON VariableOrLiteral |
OP22_LOGICAL_NEG SubExpression | SubExpression OP23_LOGICAL_AND SubExpression | SubExpression OP24_LOGICAL_OR_XOR SubExpression ;
OperatorVoid: OP01_PRINT (STDOUT_STDERR)? ListElements ';' | OP01_PRINT FHREF_SYMBOL_BRACES ListElements ';' |
OP01_NAMED_VOID_SCOLON | OP01_NAMED_VOID_LPAREN ListElements? ')' ';' | OP01_NAMED_VOID ListElements ';' |
OP01_NAMED ListElement OP21_LIST_COMMA ListElements ';' | OP19_LOOP_CONTROL_SCOLON | OP19_LOOP_CONTROL LoopLabel ';' ;
Expression: Operator | WordScoped LPAREN ListElements? ')' | WORD_UPPERCASE LPAREN ')' | Variable OP02_METHOD_THINARROW LPAREN ListElements? ')' |
WordScoped OP02_METHOD_THINARROW_NEW ')' ;
SubExpression: Expression | 'undef' | Literal | Variable | ArrayReference | ArrayDereference | HashReference | HashDereference | LPAREN SubExpression ')' ;
SubExpressionOrStdin: SubExpression | STDIN;
Statement: Conditional | (LoopLabel COLON)? Loop | OperatorVoid | VariableDeclaration | VariableModification ;
Conditional: 'if' LPAREN SubExpression ')' CodeBlock ('elsif' LPAREN SubExpression ')' CodeBlock)* ('else' CodeBlock)? ;
Loop: LoopFor | LoopForEach | LoopWhile ;
LoopFor: 'for' MY TYPE_INTEGER VARIABLE_SYMBOL LPAREN SubExpression OP17_LIST_RANGE SubExpression ')' CodeBlock ;
LoopForEach: 'foreach' MY Type VARIABLE_SYMBOL LPAREN ListElements ')' CodeBlock ;
LoopWhile: 'while' LPAREN SubExpression ')' CodeBlock ;
CodeBlock: LBRACE Operation+ '}' ;
Variable: VARIABLE_SYMBOL VariableRetrieval* ;
VariableRetrieval: OP02_ARRAY_THINARROW SubExpression ']' | OP02_HASH_THINARROW SubExpression '}' | OP02_HASH_THINARROW WORD '}' ;
VariableDeclaration: MY Type VARIABLE_SYMBOL ';' | MY Type VARIABLE_SYMBOL OP19_VARIABLE_ASSIGN SubExpressionOrStdin ';' | MY TYPE_FHREF FHREF_SYMBOL ';' ;
VariableModification: Variable OP19_VARIABLE_ASSIGN SubExpressionOrStdin ';' | Variable OP19_VARIABLE_ASSIGN_BY SubExpression ';' ;
ListElements: ListElement (OP21_LIST_COMMA ListElement)* ;
ListElement: SubExpression | TypeInner SubExpression | OP01_QW WORD+ ')' ;
ArrayReference: LBRACKET ListElements? ']' ;
ArrayDereference: '@{' Variable '}' | '@{' TypeInner? ArrayReference '}' ;
HashEntry: VariableOrLiteralOrWord OP20_HASH_FATARROW TypeInner? SubExpression | HashDereference ;
HashEntryTyped: WORD OP20_HASH_FATARROW TypeInner SubExpression | HashDereference ;
HashReference: LBRACE HashEntry (OP21_LIST_COMMA HashEntry)* '}' | LBRACE '}' ;
HashDereference: '%{' Variable '}' | '%{' TypeInner? HashReference '}' ;
WordScoped: WORD | WORD_SCOPED;
LoopLabel: WORD_UPPERCASE ;
Type: WORD | TYPE_INTEGER ;
TypeInner: MY Type '$TYPED_' WORD OP19_VARIABLE_ASSIGN ;
TypeInnerConstant: MY Type '$TYPED_' WORD_UPPERCASE OP19_VARIABLE_ASSIGN ;
VariableOrLiteral: Variable | Literal;
VariableOrLiteralOrWord: Variable | Literal | WORD;
Literal: LITERAL_NUMBER | LITERAL_STRING ;
%%
{
# Map from abstract syntax tree to classes
# DEV NOTE: derived from grammar rules in Grammar.output file, process for grammar updates...
# 1. Update grammar code in this file, above this line only
# 2. Run scripts/grammar_recompile.sh
# 3. Run new & existing grammar tests
# 4. Copy updates from Grammar.output file into this file, below this line only
# 5. Run scripts/grammar_recompile.sh again
our string_hashref $RULES = {
CompileUnit_4 => 'RPerl::CompileUnit::Program', # CompileUnit -> Program
CompileUnit_5 => 'RPerl::CompileUnit::Module', # CompileUnit -> PLUS-2
Program_18 => 'RPerl::CompileUnit::Program', # Program -> SHEBANG OPTIONAL-3 Header STAR-4 STAR-5 STAR-6 STAR-7 PLUS-8
ModuleHeader_21 => 'RPerl::CompileUnit::Module::Header', # ModuleHeader -> OPTIONAL-9 'package' WordScoped ';' Header
Module_22 => 'RPerl::CompileUnit::Module::Package', # Module -> Package
Module_23 => 'RPerl::CompileUnit::Module::Class::Generator', # Module -> Class
Package_32 => 'RPerl::CompileUnit::Module::Package', # Package -> STAR-10 STAR-11 STAR-12 PLUS-13 LITERAL_NUMBER ';'
Header_33 => 'RPerl::NonGenerator', # Header -> 'use strict;' 'use warnings;' 'use RPerl;' 'our' VERSION_NUMBER_ASSIGN
Critic_36 => 'RPerl::CompileUnit::Critic', # Critic -> '## no critic qw(' PLUS-14 ')'
Include_39 => 'RPerl::CompileUnit::Include', # Include -> 'use' WordScoped ';'
Include_40 => 'RPerl::CompileUnit::Include', # Include -> 'use' WordScoped OP01_QW PLUS-15 ')' ';'
Constant_41 => 'RPerl::CompileUnit::Constant', # Constant -> 'use constant' WORD_UPPERCASE OP20_HASH_FATARROW TypeInnerConstant Literal ';'
Subroutine_46 => 'RPerl::CodeBlock::Subroutine', # Subroutine -> 'our' Type VARIABLE_SYMBOL '= sub {' OPTIONAL-16 STAR-17 '}' ';'
SubroutineArguments_50 => 'RPerl::CodeBlock::Subroutine::Arguments', # SubroutineArguments -> LPAREN_MY Type VARIABLE_SYMBOL STAR-19 ')' OP19_VARIABLE_ASSIGN '@_;'
Class_59 => 'RPerl::CompileUnit::Module::Class::Generator', # Class -> 'use parent qw(' WordScoped ')' ';' Include STAR-20 STAR-21 STAR-22 Properties STAR-23 LITERAL_NUMBER ';'
Properties_63 => 'RPerl::DataStructure::Hash::Properties', # Properties -> 'our hashref $properties' OP19_VARIABLE_ASSIGN LBRACE HashEntryTyped STAR-25 '}' ';'
Properties_64 => 'RPerl::DataStructure::Hash::Properties', # Properties -> 'our hashref $properties' OP19_VARIABLE_ASSIGN LBRACE '}' ';'
Method_69 => 'RPerl::CodeBlock::Subroutine::Method', # Method -> 'our' TYPE_METHOD VARIABLE_SYMBOL '= sub {' OPTIONAL-26 STAR-27 '}' ';'
MethodArguments_73 => 'RPerl::CodeBlock::Subroutine::Method::Arguments', # MethodArguments -> LPAREN_MY TYPE_SELF STAR-29 ')' OP19_VARIABLE_ASSIGN '@_;'
MethodOrSubroutine_74 => 'RPerl::CodeBlock::Subroutine::Method', # MethodOrSubroutine -> Method
MethodOrSubroutine_75 => 'RPerl::CodeBlock::Subroutine', # MethodOrSubroutine -> Subroutine
Operation_76 => 'RPerl::Operation::Expression', # Operation -> Expression ';'
Operation_77 => 'RPerl::Operation::Statement', # Operation -> Statement
Operator_78 => 'RPerl::Operation::Expression::Operator::Print', # Operator -> LPAREN OP01_PRINT FHREF_SYMBOL_BRACES ListElements ')'
Operator_79 => 'RPerl::Operation::Expression::Operator::Named', # Operator -> OP01_NAMED SubExpression
Operator_80 => 'RPerl::Operation::Expression::Operator::Named', # Operator -> LPAREN OP01_NAMED ListElement OP21_LIST_COMMA ListElements ')'
Operator_81 => 'RPerl::Operation::Expression::Operator::Open', # Operator -> OP01_OPEN MY TYPE_FHREF FHREF_SYMBOL OP21_LIST_COMMA LITERAL_STRING OP21_LIST_COMMA SubExpression
Operator_82 => 'RPerl::Operation::Expression::Operator::Close', # Operator -> OP01_CLOSE FHREF_SYMBOL
Operator_83 => 'RPerl::Operation::Expression::Operator::Math::IncrementDecrement', # Operator -> OP03_MATH_INC_DEC Variable
Operator_84 => 'RPerl::Operation::Expression::Operator::Math::IncrementDecrement', # Operator -> Variable OP03_MATH_INC_DEC
Operator_85 => 'RPerl::Operation::Expression::Operator::Math::Power', # Operator -> SubExpression OP04_MATH_POW SubExpression
Operator_86 => 'RPerl::Operation::Expression::Operator::Logical::Negation', # Operator -> OP05_LOGICAL_NEG SubExpression
Operator_87 => 'RPerl::Operation::Expression::Operator::Math::Negative', # Operator -> OP05_MATH_NEG_LPAREN SubExpression ')'
Operator_88 => 'RPerl::Operation::Expression::Operator::RegularExpression', # Operator -> SubExpression OP06_REGEX_MATCH OP06_REGEX_PATTERN
Operator_89 => 'RPerl::Operation::Expression::Operator::String::Repeat', # Operator -> SubExpression OP07_STRING_REPEAT SubExpression
Operator_90 => 'RPerl::Operation::Expression::Operator::Math::MultiplyDivideModulo', # Operator -> SubExpression OP07_MATH_MULT_DIV_MOD SubExpression
Operator_91 => 'RPerl::Operation::Expression::Operator::Math::AddSubtract', # Operator -> SubExpression OP08_MATH_ADD_SUB SubExpression
Operator_92 => 'RPerl::Operation::Expression::Operator::String::Concatenate', # Operator -> SubExpression OP08_STRING_CAT SubExpression
Operator_93 => 'RPerl::Operation::Expression::Operator::Bitwise::Shift', # Operator -> SubExpression OP09_BITWISE_SHIFT SubExpression
Operator_94 => 'RPerl::Operation::Expression::Operator::NamedUnary', # Operator -> OP10_NAMED_UNARY SubExpression
Operator_95 => 'RPerl::Operation::Expression::Operator::NamedUnary', # Operator -> OP10_NAMED_UNARY
Operator_96 => 'RPerl::Operation::Expression::Operator::Compare::LessThanGreaterThan', # Operator -> SubExpression OP11_COMPARE_LT_GT SubExpression
Operator_97 => 'RPerl::Operation::Expression::Operator::Compare::EqualNotEqual', # Operator -> SubExpression OP12_COMPARE_EQ_NE SubExpression
Operator_98 => 'RPerl::Operation::Expression::Operator::Bitwise::And', # Operator -> SubExpression OP13_BITWISE_AND SubExpression
Operator_99 => 'RPerl::Operation::Expression::Operator::Bitwise::OrXor', # Operator -> SubExpression OP14_BITWISE_OR_XOR SubExpression
Operator_100 => 'RPerl::Operation::Expression::Operator::Logical::And', # Operator -> SubExpression OP15_LOGICAL_AND SubExpression
Operator_101 => 'RPerl::Operation::Expression::Operator::Logical::OrXor', # Operator -> SubExpression OP16_LOGICAL_OR SubExpression
Operator_102 => 'RPerl::Operation::Expression::Operator::List::Range', # Operator -> SubExpression OP17_LIST_RANGE SubExpression
Operator_103 => 'RPerl::Operation::Expression::Operator::Ternary', # Operator -> SubExpression OP18_TERNARY VariableOrLiteral COLON VariableOrLiteral
Operator_104 => 'RPerl::Operation::Expression::Operator::Logical::Negation', # Operator -> OP22_LOGICAL_NEG SubExpression
Operator_105 => 'RPerl::Operation::Expression::Operator::Logical::And', # Operator -> SubExpression OP23_LOGICAL_AND SubExpression
Operator_106 => 'RPerl::Operation::Expression::Operator::Logical::OrXor', # Operator -> SubExpression OP24_LOGICAL_OR_XOR SubExpression
OperatorVoid_112 => 'RPerl::Operation::Statement::OperatorVoid::Print', # OperatorVoid -> OP01_PRINT OPTIONAL-31 ListElements ';'
OperatorVoid_113 => 'RPerl::Operation::Statement::OperatorVoid::Print', # OperatorVoid -> OP01_PRINT FHREF_SYMBOL_BRACES ListElements ';'
OperatorVoid_114 => 'RPerl::Operation::Statement::OperatorVoid::Named', # OperatorVoid -> OP01_NAMED_VOID_SCOLON
OperatorVoid_115 => 'RPerl::Operation::Statement::OperatorVoid::Named', # OperatorVoid -> OP01_NAMED_VOID_LPAREN OPTIONAL-32 ')' ';'
OperatorVoid_116 => 'RPerl::Operation::Statement::OperatorVoid::Named', # OperatorVoid -> OP01_NAMED_VOID ListElements ';'
OperatorVoid_117 => 'RPerl::Operation::Expression::Operator::Named', # OperatorVoid -> OP01_NAMED ListElement OP21_LIST_COMMA ListElements ';'
OperatorVoid_118 => 'RPerl::Operation::Statement::OperatorVoid::LoopControl', # OperatorVoid -> OP19_LOOP_CONTROL_SCOLON
OperatorVoid_119 => 'RPerl::Operation::Statement::OperatorVoid::LoopControl', # OperatorVoid -> OP19_LOOP_CONTROL LoopLabel ';'
Expression_124 => 'RPerl::Operation::Expression::Operator', # Expression -> Operator
Expression_125 => 'RPerl::Operation::Expression::SubroutineCall', # Expression -> WordScoped LPAREN OPTIONAL-33 ')'
Expression_126 => 'RPerl::Operation::Expression::ConstantCall', # Expression -> WORD_UPPERCASE LPAREN ')'
Expression_127 => 'RPerl::Operation::Expression::SubroutineCall::MethodCall', # Expression -> Variable OP02_METHOD_THINARROW LPAREN OPTIONAL-34 ')'
Expression_128 => 'RPerl::Operation::Expression::SubroutineCall::MethodCall::ConstructorCall', # Expression -> WordScoped OP02_METHOD_THINARROW_NEW ')'
SubExpression_129 => 'RPerl::Operation::Expression', # SubExpression -> Expression
SubExpression_130 => 'RPerl::Operation::Expression::SubExpression::Literal::Undefined', # SubExpression -> 'undef'
SubExpression_131 => 'RPerl::Operation::Expression::SubExpression::Literal', # SubExpression -> Literal
SubExpression_132 => 'RPerl::Operation::Expression::SubExpression::Variable', # SubExpression -> Variable
SubExpression_133 => 'RPerl::DataStructure::Array::Reference', # SubExpression -> ArrayReference
SubExpression_134 => 'RPerl::Operation::Expression::SubExpression::ArrayDereference', # SubExpression -> ArrayDereference
SubExpression_135 => 'RPerl::DataStructure::Hash::Reference', # SubExpression -> HashReference
SubExpression_136 => 'RPerl::Operation::Expression::SubExpression::HashDereference', # SubExpression -> HashDereference
SubExpression_137 => 'RPerl::Operation::Expression::SubExpression::Parenthesis', # SubExpression -> LPAREN SubExpression ')'
SubExpressionOrStdin_138 => 'RPerl::Operation::Expression::SubExpression', # SubExpressionOrStdin -> SubExpression
SubExpressionOrStdin_139 => 'RPerl::InputOutput::Stdin', # SubExpressionOrStdin -> STDIN
Statement_143 => 'RPerl::Operation::Statement::Conditional', # Statement -> Conditional
Statement_144 => 'RPerl::Operation::Statement::Loop', # Statement -> OPTIONAL-36 Loop
Statement_145 => 'RPerl::Operation::Statement::OperatorVoid', # Statement -> OperatorVoid
Statement_146 => 'RPerl::Operation::Statement::VariableDeclaration', # Statement -> VariableDeclaration
Statement_147 => 'RPerl::Operation::Statement::VariableModification', # Statement -> VariableModification
Conditional_154 => 'RPerl::Operation::Statement::Conditional', # Conditional -> 'if' LPAREN SubExpression ')' CodeBlock STAR-38 OPTIONAL-40
Loop_155 => 'RPerl::Operation::Statement::Loop::For', # Loop -> LoopFor
Loop_156 => 'RPerl::Operation::Statement::Loop::ForEach', # Loop -> LoopForEach
Loop_157 => 'RPerl::Operation::Statement::Loop::While', # Loop -> LoopWhile
LoopFor_158 => 'RPerl::Operation::Statement::Loop::For', # LoopFor -> 'for' MY TYPE_INTEGER VARIABLE_SYMBOL LPAREN SubExpression OP17_LIST_RANGE SubExpression ')' CodeBlock
LoopForEach_159 => 'RPerl::Operation::Statement::Loop::ForEach', # LoopForEach -> 'foreach' MY Type VARIABLE_SYMBOL LPAREN ListElements ')' CodeBlock
LoopWhile_160 => 'RPerl::Operation::Statement::Loop::While', # LoopWhile -> 'while' LPAREN SubExpression ')' CodeBlock
CodeBlock_163 => 'RPerl::CodeBlock', # CodeBlock -> LBRACE PLUS-41 '}'
Variable_166 => 'RPerl::Operation::Expression::SubExpression::Variable', # Variable -> VARIABLE_SYMBOL STAR-42
VariableRetrieval_167 => 'RPerl::Operation::Expression::SubExpression::Variable::Retrieval', # VariableRetrieval -> OP02_ARRAY_THINARROW SubExpression ']'
VariableRetrieval_168 => 'RPerl::Operation::Expression::SubExpression::Variable::Retrieval', # VariableRetrieval -> OP02_HASH_THINARROW SubExpression '}'
VariableRetrieval_169 => 'RPerl::Operation::Expression::SubExpression::Variable::Retrieval', # VariableRetrieval -> OP02_HASH_THINARROW WORD '}'
VariableDeclaration_170 => 'RPerl::Operation::Statement::VariableDeclaration', # VariableDeclaration -> MY Type VARIABLE_SYMBOL ';'
VariableDeclaration_171 => 'RPerl::Operation::Statement::VariableDeclaration', # VariableDeclaration -> MY Type VARIABLE_SYMBOL OP19_VARIABLE_ASSIGN SubExpressionOrStdin ';'
VariableDeclaration_172 => 'RPerl::Operation::Statement::VariableDeclaration', # VariableDeclaration -> MY TYPE_FHREF FHREF_SYMBOL ';'
VariableModification_173 => 'RPerl::Operation::Statement::VariableModification', # VariableModification -> Variable OP19_VARIABLE_ASSIGN SubExpressionOrStdin ';'
VariableModification_174 => 'RPerl::Operation::Statement::VariableModification', # VariableModification -> Variable OP19_VARIABLE_ASSIGN_BY SubExpression ';'
ListElements_178 => 'RPerl::DataStructure::Array::ListElements', # ListElements -> ListElement STAR-43
ListElement_181 => 'RPerl::Operation::Expression::SubExpression', # ListElement -> SubExpression
ListElement_182 => 'RPerl::Operation::Expression::SubExpression', # ListElement -> TypeInner SubExpression
ListElement_183 => 'RPerl::DataStructure::Array::ListElement', # ListElement -> OP01_QW PLUS-44 ')'
ArrayReference_186 => 'RPerl::DataStructure::Array::Reference', # ArrayReference -> LBRACKET OPTIONAL-45 ']'
ArrayDereference_189 => 'RPerl::Operation::Expression::SubExpression::ArrayDereference', # ArrayDereference -> '@{' Variable '}'
ArrayDereference_190 => 'RPerl::Operation::Expression::SubExpression::ArrayDereference', # ArrayDereference -> '@{' OPTIONAL-47 ArrayReference '}'
HashEntry_193 => 'RPerl::DataStructure::Hash::Entry', # HashEntry -> VariableOrLiteralOrWord OP20_HASH_FATARROW OPTIONAL-47 SubExpression
HashEntry_194 => 'RPerl::Operation::Expression::SubExpression::HashDereference', # HashEntry -> HashDereference
HashEntryTyped_195 => 'RPerl::DataStructure::Hash::EntryTyped', # HashEntryTyped -> WORD OP20_HASH_FATARROW TypeInner SubExpression
HashEntryTyped_196 => 'RPerl::Operation::Expression::SubExpression::HashDereference', # HashEntryTyped -> HashDereference
HashReference_200 => 'RPerl::DataStructure::Hash::Reference', # HashReference -> LBRACE HashEntry STAR-50 '}'
HashReference_201 => 'RPerl::DataStructure::Hash::Reference', # HashReference -> LBRACE '}'
HashDereference_204 => 'RPerl::Operation::Expression::SubExpression::HashDereference', # HashDereference -> '%{' Variable '}'
HashDereference_205 => 'RPerl::Operation::Expression::SubExpression::HashDereference', # HashDereference -> '%{' OPTIONAL-51 HashReference '}'
WordScoped_206 => 'RPerl::NonGenerator', # WordScoped -> WORD
WordScoped_207 => 'RPerl::NonGenerator', # WordScoped -> WORD_SCOPED
LoopLabel_208 => 'RPerl::NonGenerator', # LoopLabel -> WORD_UPPERCASE # RPerl::Operation::Statement -> LoopLabel COLON
Type_209 => 'RPerl::NonGenerator', # Type -> WORD
Type_210 => 'RPerl::NonGenerator', # Type -> TYPE_INTEGER
TypeInner_211 => 'RPerl::DataType::TypeInner', # TypeInner -> MY Type '$TYPED_' WORD OP19_VARIABLE_ASSIGN
TypeInnerConstant_212 => 'RPerl::NonGenerator', # TypeInnerConstant -> MY Type '$TYPED_' WORD_UPPERCASE OP19_VARIABLE_ASSIGN
VariableOrLiteral_213 => 'RPerl::Operation::Expression::SubExpression::Variable', # VariableOrLiteral -> Variable
VariableOrLiteral_214 => 'RPerl::Operation::Expression::SubExpression::Literal', # VariableOrLiteral -> Literal
VariableOrLiteralOrWord_215 => 'RPerl::Operation::Expression::SubExpression::Variable', # VariableOrLiteralOrWord -> Variable
VariableOrLiteralOrWord_216 => 'RPerl::Operation::Expression::SubExpression::Literal', # VariableOrLiteralOrWord -> Literal
VariableOrLiteralOrWord_217 => 'RPerl::NonGenerator', # VariableOrLiteralOrWord -> WORD
Literal_218 => 'RPerl::Operation::Expression::SubExpression::Literal::Number', # Literal -> LITERAL_NUMBER
Literal_219 => 'RPerl::Operation::Expression::SubExpression::Literal::String' # Literal -> LITERAL_STRING
};
1;
}