File Coverage

blib/lib/Guacamole.pm
Criterion Covered Total %
statement 61 61 100.0
branch 7 8 87.5
condition n/a
subroutine 6 6 100.0
pod 0 2 0.0
total 74 77 96.1


line stmt bran cond sub pod time code
1             package Guacamole;
2             our $AUTHORITY = 'cpan:XSAWYERX';
3             # ABSTRACT: A parser toolkit for Standard Perl
4             $Guacamole::VERSION = '0.006';
5 35     35   250 use strict;
  35         72  
  35         1124  
6 35     35   229 use warnings;
  35         67  
  35         989  
7 35     35   15512 use Marpa::R2;
  35         4819992  
  35         1915  
8             use constant {
9 35         48811 'DEBUG' => 0,
10 35     35   324 };
  35         112  
11              
12             my $grammar_source = q{
13             lexeme default = latm => 1
14             :default ::= action => [ name, start, length, values ]
15              
16             Program ::= StatementSeq
17              
18             StatementSeq ::= Statement
19             | Statement Semicolon
20             | Statement Semicolon StatementSeq
21             | BlockStatement
22             | BlockStatement StatementSeq
23              
24             # Statements that end with a block and do not need a semicolon terminator.
25             BlockStatement ::= LoopStatement
26             | PackageStatement
27             | SubStatement
28             | Condition
29             | BlockNonEmpty
30              
31             Statement ::= BlockLevelExpression StatementModifier
32             | BlockLevelExpression
33             | EllipsisStatement
34             | UseStatement
35             | NoStatement
36             | RequireStatement
37             | PackageDeclaration
38             | SubDeclaration
39              
40             LoopStatement ::= ForStatement
41             | WhileStatement
42             | UntilStatement
43              
44             ForStatement ::= ForStatementOp LParen Statement Semicolon Statement Semicolon Statement RParen Block ContinueExpr
45             | ForStatementOp LParen Statement Semicolon Statement Semicolon Statement RParen Block
46             | ForStatementOp OpKeywordMy VarScalar LParen Expression RParen Block ContinueExpr
47             | ForStatementOp OpKeywordMy VarScalar LParen Expression RParen Block
48             | ForStatementOp VarScalar LParen Expression RParen Block ContinueExpr
49             | ForStatementOp VarScalar LParen Expression RParen Block
50             | ForStatementOp LParen Semicolon Semicolon RParen Block ContinueExpr
51             | ForStatementOp LParen Semicolon Semicolon RParen Block
52             | ForStatementOp LParen Expression RParen Block ContinueExpr
53             | ForStatementOp LParen Expression RParen Block
54              
55             ContinueExpr ::= OpKeywordContinue Block
56              
57             ForStatementOp ::= OpKeywordFor
58             | OpKeywordForeach
59              
60             WhileStatement ::= ConditionWhile LParen Expression RParen Block OpKeywordContinue Block
61             | ConditionWhile LParen Expression RParen Block
62             | ConditionWhile LParen RParen Block OpKeywordContinue Block
63             | ConditionWhile LParen RParen Block
64              
65             UntilStatement ::= ConditionUntil LParen Expression RParen Block OpKeywordContinue Block
66             | ConditionUntil LParen Expression RParen Block
67              
68             StatementModifier ::= ConditionIfPostfixExpr
69             | ConditionUnlessPostfixExpr
70             | ConditionWhilePostfixExpr
71             | ConditionUntilPostfixExpr
72             | ConditionForPostfixExpr
73             | ConditionForeachPostfixExpr
74              
75             EllipsisStatement ::= Ellipsis
76              
77             UseStatement ::= OpKeywordUse ClassIdent VersionExpr Expression
78             | OpKeywordUse ClassIdent VersionExpr
79             | OpKeywordUse ClassIdent Expression
80             | OpKeywordUse VersionExpr
81             | OpKeywordUse ClassIdent
82              
83             NoStatement ::= OpKeywordNo ClassIdent VersionExpr Expression
84             | OpKeywordNo ClassIdent VersionExpr
85             | OpKeywordNo ClassIdent Expression
86             | OpKeywordNo VersionExpr
87             | OpKeywordNo ClassIdent
88              
89             RequireStatement ::= OpKeywordRequire VersionExpr
90             | OpKeywordRequire ClassIdent
91             | OpKeywordRequire Expression
92              
93             PackageStatement ::= OpKeywordPackage ClassIdent VersionExpr Block
94             | OpKeywordPackage ClassIdent Block
95             PackageDeclaration ::= OpKeywordPackage ClassIdent VersionExpr
96             | OpKeywordPackage ClassIdent
97              
98             SubStatement ::= PhaseStatement Block
99             | OpKeywordSub PhaseStatement Block
100             | OpKeywordSub SubNameExpr SubDefinition
101              
102             SubDeclaration ::= OpKeywordSub SubNameExpr
103              
104             SubDefinition ::= SubAttrsDefinitionSeq SubSigsDefinition Block
105             | SubAttrsDefinitionSeq Block
106             | SubSigsDefinition Block
107             | Block
108              
109             SubAttrsDefinitionSeq ::= SubAttrsDefinition SubAttrsDefinitionSeq
110             | SubAttrsDefinition
111              
112             SubAttrsDefinition ::= Colon IdentComp SubAttrArgs
113             | Colon IdentComp
114              
115             SubSigsDefinition ::= ParenExpr
116              
117             PhaseStatement ::= PhaseName
118              
119             Condition ::= ConditionIfExpr ConditionElsifExpr ConditionElseExpr
120             | ConditionIfExpr ConditionElseExpr
121             | ConditionIfExpr ConditionElsifExpr
122             | ConditionIfExpr
123             | ConditionUnlessExpr
124              
125             ConditionUnlessExpr ::= ConditionUnless LParen Expression RParen Block
126             ConditionIfExpr ::= ConditionIf LParen Expression RParen Block
127             ConditionElsifExpr ::= ConditionElsif LParen Expression RParen Block ConditionElsifExpr
128             | ConditionElsif LParen Expression RParen Block
129             ConditionElseExpr ::= ConditionElse Block
130             ConditionIfPostfixExpr ::= ConditionIf Expression
131             ConditionUnlessPostfixExpr ::= ConditionUnless Expression
132             ConditionWhilePostfixExpr ::= ConditionWhile Expression
133             ConditionUntilPostfixExpr ::= ConditionUntil Expression
134             ConditionForPostfixExpr ::= ConditionFor Expression
135             ConditionForeachPostfixExpr ::= ConditionForeach Expression
136              
137             Label ::= IdentComp Colon
138              
139             # this is based on the order of ops in `perldoc perlop`
140             # U can be LHS of shift and up
141             # 0 can be LHS of assignment and up
142             # L can be LHS of comma and up
143             # R can be LHS of anything
144             ExprValueU ::= Value
145             ExprValue0 ::= Value | OpUnaryKeywordExpr
146             ExprValueL ::= Value | OpAssignKeywordExpr | OpUnaryKeywordExpr
147             ExprValueR ::= Value | OpListKeywordExpr | OpAssignKeywordExpr | OpUnaryKeywordExpr
148             ExprArrowU ::= ExprArrowU OpArrow ArrowRHS | ExprValueU action => ::first
149             ExprArrow0 ::= ExprArrowU OpArrow ArrowRHS | ExprValue0 action => ::first
150             ExprArrowL ::= ExprArrowU OpArrow ArrowRHS | ExprValueL action => ::first
151             ExprArrowR ::= ExprArrowU OpArrow ArrowRHS | ExprValueR action => ::first
152             ExprIncU ::= OpInc ExprArrowU | ExprArrowR OpInc | ExprArrowU action => ::first
153             ExprInc0 ::= OpInc ExprArrow0 | ExprArrowR OpInc | ExprArrow0 action => ::first
154             ExprIncL ::= OpInc ExprArrowL | ExprArrowR OpInc | ExprArrowL action => ::first
155             ExprIncR ::= OpInc ExprArrowR | ExprArrowL OpInc | ExprArrowR action => ::first
156             ExprPowerU ::= ExprIncU OpPower ExprUnaryU | ExprIncU action => ::first
157             ExprPower0 ::= ExprIncU OpPower ExprUnary0 | ExprInc0 action => ::first
158             ExprPowerL ::= ExprIncU OpPower ExprUnaryL | ExprIncL action => ::first
159             ExprPowerR ::= ExprIncU OpPower ExprUnaryR | ExprIncR action => ::first
160             ExprUnaryU ::= OpUnary ExprUnaryU | ExprPowerU action => ::first
161             ExprUnary0 ::= OpUnary ExprUnary0 | ExprPower0 action => ::first
162             ExprUnaryL ::= OpUnary ExprUnaryL | ExprPowerL action => ::first
163             ExprUnaryR ::= OpUnary ExprUnaryR | ExprPowerR action => ::first
164             ExprRegexU ::= ExprRegexU OpRegex ExprUnaryU | ExprUnaryU action => ::first
165             ExprRegex0 ::= ExprRegexU OpRegex ExprUnary0 | ExprUnary0 action => ::first
166             ExprRegexL ::= ExprRegexU OpRegex ExprUnaryL | ExprUnaryL action => ::first
167             ExprRegexR ::= ExprRegexU OpRegex ExprUnaryR | ExprUnaryR action => ::first
168             ExprMulU ::= ExprMulU OpMulti ExprRegexU | ExprRegexU action => ::first
169             ExprMul0 ::= ExprMulU OpMulti ExprRegex0 | ExprRegex0 action => ::first
170             ExprMulL ::= ExprMulU OpMulti ExprRegexL | ExprRegexL action => ::first
171             ExprMulR ::= ExprMulU OpMulti ExprRegexR | ExprRegexR action => ::first
172             ExprAddU ::= ExprAddU OpAdd ExprMulU | ExprMulU action => ::first
173             ExprAdd0 ::= ExprAddU OpAdd ExprMul0 | ExprMul0 action => ::first
174             ExprAddL ::= ExprAddU OpAdd ExprMulL | ExprMulL action => ::first
175             ExprAddR ::= ExprAddU OpAdd ExprMulR | ExprMulR action => ::first
176             ExprShiftU ::= ExprShiftU OpShift ExprAddU | ExprAddU action => ::first
177             ExprShift0 ::= ExprShiftU OpShift ExprAdd0 | ExprAdd0 action => ::first
178             ExprShiftL ::= ExprShiftU OpShift ExprAddL | ExprAddL action => ::first
179             ExprShiftR ::= ExprShiftU OpShift ExprAddR | ExprAddR action => ::first
180             ExprNeq0 ::= ExprShift0 OpInequal ExprShift0 | ExprShift0 action => ::first
181             ExprNeqL ::= ExprShift0 OpInequal ExprShiftL | ExprShiftL action => ::first
182             ExprNeqR ::= ExprShift0 OpInequal ExprShiftR | ExprShiftR action => ::first
183             ExprEq0 ::= ExprNeq0 OpEqual ExprNeq0 | ExprNeq0 action => ::first
184             ExprEqL ::= ExprNeq0 OpEqual ExprNeqL | ExprNeqL action => ::first
185             ExprEqR ::= ExprNeq0 OpEqual ExprNeqR | ExprNeqR action => ::first
186             ExprBinAnd0 ::= ExprBinAnd0 OpBinAnd ExprEq0 | ExprEq0 action => ::first
187             ExprBinAndL ::= ExprBinAnd0 OpBinAnd ExprEqL | ExprEqL action => ::first
188             ExprBinAndR ::= ExprBinAnd0 OpBinAnd ExprEqR | ExprEqR action => ::first
189             ExprBinOr0 ::= ExprBinOr0 OpBinOr ExprBinAnd0 | ExprBinAnd0 action => ::first
190             ExprBinOrL ::= ExprBinOr0 OpBinOr ExprBinAndL | ExprBinAndL action => ::first
191             ExprBinOrR ::= ExprBinOr0 OpBinOr ExprBinAndR | ExprBinAndR action => ::first
192             ExprLogAnd0 ::= ExprLogAnd0 OpLogAnd ExprBinOr0 | ExprBinOr0 action => ::first
193             ExprLogAndL ::= ExprLogAnd0 OpLogAnd ExprBinOrL | ExprBinOrL action => ::first
194             ExprLogAndR ::= ExprLogAnd0 OpLogAnd ExprBinOrR | ExprBinOrR action => ::first
195             ExprLogOr0 ::= ExprLogOr0 OpLogOr ExprLogAnd0 | ExprLogAnd0 action => ::first
196             ExprLogOrL ::= ExprLogOr0 OpLogOr ExprLogAndL | ExprLogAndL action => ::first
197             ExprLogOrR ::= ExprLogOr0 OpLogOr ExprLogAndR | ExprLogAndR action => ::first
198             ExprRange0 ::= ExprLogOr0 OpRange ExprLogOr0 | ExprLogOr0 action => ::first
199             ExprRangeL ::= ExprLogOr0 OpRange ExprLogOrL | ExprLogOrL action => ::first
200             ExprRangeR ::= ExprLogOr0 OpRange ExprLogOrR | ExprLogOrR action => ::first
201             ExprCond0 ::= ExprRange0 OpTriThen ExprRange0 OpTriElse ExprCond0 | ExprRange0 action => ::first
202             ExprCondL ::= ExprRange0 OpTriThen ExprRangeL OpTriElse ExprCondL | ExprRangeL action => ::first
203             ExprCondR ::= ExprRange0 OpTriThen ExprRangeR OpTriElse ExprCondR | ExprRangeR action => ::first
204             ExprAssignL ::= ExprCond0 OpAssign ExprAssignL | OpAssignKeywordExpr
205             | ExprCondL action => ::first
206             ExprAssignR ::= ExprCond0 OpAssign ExprAssignR | ExprCondR action => ::first
207             ExprComma ::= ExprAssignL OpComma ExprComma | ExprAssignL OpComma | ExprAssignR action => ::first
208             ExprNameNot ::= OpNameNot ExprNameNot | ExprComma action => ::first
209             ExprNameAnd ::= ExprNameAnd OpNameAnd ExprNameNot | ExprNameNot action => ::first
210             ExprNameOr ::= ExprNameOr OpNameOr ExprNameAnd | ExprNameAnd action => ::first
211             Expression ::= ExprNameOr action => ::first
212              
213             # These will never be evaluated as a hashref (LiteralHash)
214             # because hashrefs are not allowed to be top-level
215             # Being combined combined with '+' or 'return' means they aren't top-level,
216             # but follow top-level tokens ('+' or 'return')
217             NonBraceExprValueU ::= NonBraceValue
218             NonBraceExprValue0 ::= NonBraceValue | OpUnaryKeywordExpr
219             NonBraceExprValueL ::= NonBraceValue | OpAssignKeywordExpr | OpUnaryKeywordExpr
220             NonBraceExprValueR ::= NonBraceValue | OpListKeywordExpr | OpAssignKeywordExpr | OpUnaryKeywordExpr
221             NonBraceExprArrowU ::= NonBraceExprArrowU OpArrow ArrowRHS | NonBraceExprValueU action => ::first
222             NonBraceExprArrow0 ::= NonBraceExprArrowU OpArrow ArrowRHS | NonBraceExprValue0 action => ::first
223             NonBraceExprArrowL ::= NonBraceExprArrowU OpArrow ArrowRHS | NonBraceExprValueL action => ::first
224             NonBraceExprArrowR ::= NonBraceExprArrowU OpArrow ArrowRHS | NonBraceExprValueR action => ::first
225             NonBraceExprIncU ::= OpInc ExprArrowU | NonBraceExprArrowR OpInc | NonBraceExprArrowU action => ::first
226             NonBraceExprInc0 ::= OpInc ExprArrow0 | NonBraceExprArrowR OpInc | NonBraceExprArrow0 action => ::first
227             NonBraceExprIncL ::= OpInc ExprArrowL | NonBraceExprArrowR OpInc | NonBraceExprArrowL action => ::first
228             NonBraceExprIncR ::= OpInc ExprArrowR | NonBraceExprArrowL OpInc | NonBraceExprArrowR action => ::first
229             NonBraceExprPowerU ::= NonBraceExprIncU OpPower ExprUnaryU | NonBraceExprIncU action => ::first
230             NonBraceExprPower0 ::= NonBraceExprIncU OpPower ExprUnary0 | NonBraceExprInc0 action => ::first
231             NonBraceExprPowerL ::= NonBraceExprIncU OpPower ExprUnaryL | NonBraceExprIncL action => ::first
232             NonBraceExprPowerR ::= NonBraceExprIncU OpPower ExprUnaryR | NonBraceExprIncR action => ::first
233             NonBraceExprUnaryU ::= OpUnary ExprUnaryU | NonBraceExprPowerU action => ::first
234             NonBraceExprUnary0 ::= OpUnary ExprUnary0 | NonBraceExprPower0 action => ::first
235             NonBraceExprUnaryL ::= OpUnary ExprUnaryL | NonBraceExprPowerL action => ::first
236             NonBraceExprUnaryR ::= OpUnary ExprUnaryR | NonBraceExprPowerR action => ::first
237             NonBraceExprRegexU ::= NonBraceExprRegexU OpRegex ExprUnaryU | NonBraceExprUnaryU action => ::first
238             NonBraceExprRegex0 ::= NonBraceExprRegexU OpRegex ExprUnary0 | NonBraceExprUnary0 action => ::first
239             NonBraceExprRegexL ::= NonBraceExprRegexU OpRegex ExprUnaryL | NonBraceExprUnaryL action => ::first
240             NonBraceExprRegexR ::= NonBraceExprRegexU OpRegex ExprUnaryR | NonBraceExprUnaryR action => ::first
241             NonBraceExprMulU ::= NonBraceExprMulU OpMulti ExprRegexU | NonBraceExprRegexU action => ::first
242             NonBraceExprMul0 ::= NonBraceExprMulU OpMulti ExprRegex0 | NonBraceExprRegex0 action => ::first
243             NonBraceExprMulL ::= NonBraceExprMulU OpMulti ExprRegexL | NonBraceExprRegexL action => ::first
244             NonBraceExprMulR ::= NonBraceExprMulU OpMulti ExprRegexR | NonBraceExprRegexR action => ::first
245             NonBraceExprAddU ::= NonBraceExprAddU OpAdd ExprMulU | NonBraceExprMulU action => ::first
246             NonBraceExprAdd0 ::= NonBraceExprAddU OpAdd ExprMul0 | NonBraceExprMul0 action => ::first
247             NonBraceExprAddL ::= NonBraceExprAddU OpAdd ExprMulL | NonBraceExprMulL action => ::first
248             NonBraceExprAddR ::= NonBraceExprAddU OpAdd ExprMulR | NonBraceExprMulR action => ::first
249             NonBraceExprShiftU ::= NonBraceExprShiftU OpShift ExprAddU | NonBraceExprAddU action => ::first
250             NonBraceExprShift0 ::= NonBraceExprShiftU OpShift ExprAdd0 | NonBraceExprAdd0 action => ::first
251             NonBraceExprShiftL ::= NonBraceExprShiftU OpShift ExprAddL | NonBraceExprAddL action => ::first
252             NonBraceExprShiftR ::= NonBraceExprShiftU OpShift ExprAddR | NonBraceExprAddR action => ::first
253             NonBraceExprNeq0 ::= NonBraceExprShift0 OpInequal ExprShift0 | NonBraceExprShift0 action => ::first
254             NonBraceExprNeqL ::= NonBraceExprShift0 OpInequal ExprShiftL | NonBraceExprShiftL action => ::first
255             NonBraceExprNeqR ::= NonBraceExprShift0 OpInequal ExprShiftR | NonBraceExprShiftR action => ::first
256             NonBraceExprEq0 ::= NonBraceExprNeq0 OpEqual ExprNeq0 | NonBraceExprNeq0 action => ::first
257             NonBraceExprEqL ::= NonBraceExprNeq0 OpEqual ExprNeqL | NonBraceExprNeqL action => ::first
258             NonBraceExprEqR ::= NonBraceExprNeq0 OpEqual ExprNeqR | NonBraceExprNeqR action => ::first
259             NonBraceExprBinAnd0 ::= NonBraceExprBinAnd0 OpBinAnd ExprEq0 | NonBraceExprEq0 action => ::first
260             NonBraceExprBinAndL ::= NonBraceExprBinAnd0 OpBinAnd ExprEqL | NonBraceExprEqL action => ::first
261             NonBraceExprBinAndR ::= NonBraceExprBinAnd0 OpBinAnd ExprEqR | NonBraceExprEqR action => ::first
262             NonBraceExprBinOr0 ::= NonBraceExprBinOr0 OpBinOr ExprBinAnd0 | NonBraceExprBinAnd0 action => ::first
263             NonBraceExprBinOrL ::= NonBraceExprBinOr0 OpBinOr ExprBinAndL | NonBraceExprBinAndL action => ::first
264             NonBraceExprBinOrR ::= NonBraceExprBinOr0 OpBinOr ExprBinAndR | NonBraceExprBinAndR action => ::first
265             NonBraceExprLogAnd0 ::= NonBraceExprLogAnd0 OpLogAnd ExprBinOr0 | NonBraceExprBinOr0 action => ::first
266             NonBraceExprLogAndL ::= NonBraceExprLogAnd0 OpLogAnd ExprBinOrL | NonBraceExprBinOrL action => ::first
267             NonBraceExprLogAndR ::= NonBraceExprLogAnd0 OpLogAnd ExprBinOrR | NonBraceExprBinOrR action => ::first
268             NonBraceExprLogOr0 ::= NonBraceExprLogOr0 OpLogOr ExprLogAnd0 | NonBraceExprLogAnd0 action => ::first
269             NonBraceExprLogOrL ::= NonBraceExprLogOr0 OpLogOr ExprLogAndL | NonBraceExprLogAndL action => ::first
270             NonBraceExprLogOrR ::= NonBraceExprLogOr0 OpLogOr ExprLogAndR | NonBraceExprLogAndR action => ::first
271             NonBraceExprRange0 ::= NonBraceExprLogOr0 OpRange ExprLogOr0 | NonBraceExprLogOr0 action => ::first
272             NonBraceExprRangeL ::= NonBraceExprLogOr0 OpRange ExprLogOrL | NonBraceExprLogOrL action => ::first
273             NonBraceExprRangeR ::= NonBraceExprLogOr0 OpRange ExprLogOrR | NonBraceExprLogOrR action => ::first
274             NonBraceExprCond0 ::= NonBraceExprRange0 OpTriThen ExprRange0 OpTriElse ExprCond0 | NonBraceExprRange0 action => ::first
275             NonBraceExprCondL ::= NonBraceExprRange0 OpTriThen ExprRangeL OpTriElse ExprCondL | NonBraceExprRangeL action => ::first
276             NonBraceExprCondR ::= NonBraceExprRange0 OpTriThen ExprRangeR OpTriElse ExprCondR | NonBraceExprRangeR action => ::first
277             NonBraceExprAssignL ::= NonBraceExprCond0 OpAssign ExprAssignL | OpAssignKeywordExpr
278             | NonBraceExprCondL action => ::first
279             NonBraceExprAssignR ::= NonBraceExprCond0 OpAssign ExprAssignR | NonBraceExprCondR action => ::first
280              
281              
282             NonBraceExprComma ::= NonBraceExprAssignL OpComma ExprComma | NonBraceExprAssignR action => ::first
283              
284             # Comma is only allowed if it follows a keyword operator, to avoid block/hash disambiguation in perl.
285             BlockLevelExprNameNot ::= OpNameNot ExprNameNot | NonBraceExprAssignR action => ::first
286             BlockLevelExprNameAnd ::= BlockLevelExprNameAnd OpNameAnd ExprNameNot | BlockLevelExprNameNot action => ::first
287             BlockLevelExprNameOr ::= BlockLevelExprNameOr OpNameOr ExprNameAnd | BlockLevelExprNameAnd action => ::first
288             BlockLevelExpression ::= BlockLevelExprNameOr action => ::first
289              
290             Value ::= Literal | NonLiteral | QLikeValue
291              
292             # Arguments of operators according to the operator precedence
293             OpUnaryKeywordArg ::= ExprShiftR
294             OpUnaryKeywordArgNonBrace ::= NonBraceExprShiftR
295             OpAssignKeywordArg ::= ExprAssignR
296             OpListKeywordArg ::= ExprComma
297             OpListKeywordArgNonBrace ::= NonBraceExprComma
298              
299             # Same as Value above, but with a NonBraceLiteral
300             NonBraceValue ::= NonBraceLiteral | NonLiteral | QLikeValue
301              
302             NonLiteral ::= Variable
303             | DerefVariable
304             | Modifier Variable
305             | Modifier ParenExpr
306             | UnderscoreValues
307             | SubCall
308             | PackageArrow
309             | ParenExpr ElemSeq0
310             | OpNullaryKeywordExpr
311             | DiamondExpr
312              
313             DiamondExpr ::= Diamond
314             | DoubleDiamond
315              
316             # This is written this way because of whitespace rules
317             Diamond ::= '<' VarScalar '>'
318             | '<' BuiltinFilehandle '>'
319             | '<>'
320              
321             # This is written this way because of whitespace rules
322             DoubleDiamond ::= '<<' VarScalar '>>'
323             | '<<' BuiltinFilehandle '>>'
324             | '<<>>'
325              
326             ParenExpr ::= LParen Expression RParen
327             | LParen RParen # support ()
328              
329             Modifier ::= OpKeywordMy | OpKeywordOur | OpKeywordLocal | OpKeywordState
330              
331             ElemSeq0 ::= Element*
332             ElemSeq1 ::= Element+
333             Element ::= ArrayElem | HashElem
334              
335             # UnderscoreData and UnderscoreEnd are not values
336             UnderscoreValues ::= UnderscorePackage
337             | UnderscoreFile
338             | UnderscoreLine
339             | UnderscoreSub
340              
341             # Silence these until they are supported
342             #UnderscoreTokens ::= UnderscoreValues
343             # | UnderscoreData
344             # | UnderscoreEnd
345              
346             Variable ::= GlobalVarExpr
347             | VarScalar
348             | VarArray
349             | VarHash
350             | VarCode
351             | VarGlob
352             | VarArrayTop
353              
354             GlobalVarExpr ::= '$#'
355             | SigilScalar GlobalVariables ElemSeq0
356             | SigilArray GlobalVariables ElemSeq0
357             | SigilHash GlobalVariables ElemSeq0
358             | SigilGlob GlobalVariables ElemSeq0
359              
360             VarScalar ::= SigilScalar VarIdentExpr ElemSeq0
361             VarArray ::= SigilArray VarIdentExpr ElemSeq0
362             VarHash ::= SigilHash VarIdentExpr ElemSeq0
363             VarCode ::= SigilCode VarIdentExpr
364             VarGlob ::= SigilGlob VarIdentExpr
365             VarArrayTop ::= SigilArrayTop VarIdentExpr
366              
367             SubCall ::= SubNameCallExpr CallArgs
368             | VarCode CallArgs
369              
370             PackageArrow ::= SubNameExpr OpArrow PackageArrowRHS
371              
372             PackageArrowRHS ::= ArrowMethodCall
373             | ArrowIndirectCall
374              
375             # Used for function calls (Non-QLikeValue string)
376             SubNameCallExpr ::= SubNameNonQLike
377             | SubNameCallExpr PackageSep SubNameNonQLike
378              
379             # Used for defining subs (no limits)
380             SubNameExpr ::= SubName
381             | SubNameExpr PackageSep SubName
382              
383             # SubName is used for methods and subroutine definitions
384             # They are not limited in any regard (other than no-digits in first char)
385             SubName ~ LeadingSubLetter CoreSubLetters
386             LeadingSubLetter ~ [a-zA-Z_]
387             CoreSubLetters ~ [a-zA-Z0-9_]*
388              
389             # SubNameNonQLike is for function calls
390             # They are not allowed to be:
391             # q / qq / qw / qr / qx
392             # s / m / y / tr
393             SubNameNonQLike ~
394             NonQLikeLetters # [non-qlike]
395             | NonQLikeLetters AllSubLetters # [non-qlike][*]
396             | 'q' NonQRWXLetters # q[non-qrwx]
397             | 'q' NonQRWXLetters AllSubLetters # q[non-qrwx][*]
398             | 'qq' AllSubLetters # qq[*]
399             | 'qr' AllSubLetters # qr[*]
400             | 'qw' AllSubLetters # qw[*]
401             | 'qx' AllSubLetters # qx[*]
402             | 't' # t
403             | 't' NonRLetter # t[non-r]
404             | 't' NonRLetter AllSubLetters # t[non-r][*]
405             | 'tr' AllSubLetters # tr[*]
406             | 's' AllSubLetters # s[*]
407             | 'm' AllSubLetters # m[*]
408             | 'y' AllSubLetters # y[*]
409              
410             # Variables are defined using a different ident
411             # Namespaced variables ($x::y) might have a different ident
412             VarIdentExpr ::= VarIdent
413             | VarIdentExpr PackageSep VarIdent
414              
415             VarIdent ~ NonGlobalVarLetters
416             | NonGlobalVarLetters AllVarLetters
417             | '_' AllVarLetters
418              
419             NonGlobalVarLetters ~ [a-zA-Z]+
420             AllVarLetters ~ [a-zA-Z0-9_]+
421              
422             GlobalVariables ~ '!'
423             | '"'
424             | '%'
425             | '&'
426             | [']
427             | '('
428             | ')'
429             | '*'
430             | '+'
431             | ','
432             | '-'
433             | '.'
434             | '/'
435             | ':'
436             | ';'
437             | '<'
438             | '='
439             | '>'
440             | '?'
441             | '@'
442             | '['
443             | '\\'
444             | ']'
445             | '^'
446             | '_'
447             | '`'
448             | '|'
449             | '~'
450             | '$'
451             | '^A'
452             | '^C'
453             | '{^CHILD_ERROR_NATIVE}'
454             | '^D'
455             | '^E'
456             | '{^ENCODING}'
457             | '^F'
458             | '{^GLOBAL_PHASE}'
459             | '^H'
460             | '^I'
461             | '^L'
462             | '{^LAST_FH}'
463             | '^M'
464             | '{^MATCH}'
465             | '^N'
466             | '^O'
467             | '{^OPEN}'
468             | '^P'
469             | '{^POSTMATCH}'
470             | '{^PREMATCH}'
471             | '^R'
472             | '{^RE_COMPILE_RECURSION_LIMIT}'
473             | '{^RE_DEBUG_FLAGS}'
474             | '{^RE_TRIE_MAXBUF}'
475             | '^S'
476             | '{^SAFE_LOCALES}'
477             | '^T'
478             | '{^TAINT}'
479             | '{^UNICODE}'
480             | '{^UTF8CACHE}'
481             | '{^UTF8LOCALE}'
482             | '^V'
483             | '^W'
484             | '{^WARNING_BITS}'
485             | '{^WIN32_SLOPPY_STAT}'
486             | '^X'
487             | '{^CAPTURE}'
488             | '{^CAPTURE_ALL}'
489             | Digits
490              
491             # This uses the same definition as subroutine names
492             # In the future, we might want to split those
493             # but they are basically the same
494             ClassIdent ::= SubNameExpr
495              
496             CallArgs ::= ParenExpr
497              
498             # Depending on context, "{}" may be interpreted as an empty block or a hash literal.
499             Block ::= BlockEmpty action => ::first
500             | BlockNonEmpty action => ::first
501             BlockEmpty ::= LBrace RBrace name => Block
502             BlockNonEmpty ::= LBrace StatementSeq RBrace name => Block
503              
504             ArrayElem ::= LBracket Expression RBracket
505              
506             HashElem ::= LBrace Expression RBrace
507              
508             NonBraceLiteral ::= LitNumber
509             | LitArray
510             | LitString
511             | InterpolString
512             | LitHashEmpty
513              
514             Literal ::= NonBraceLiteral
515             | LitHashNonEmpty
516              
517             LitArray ::= LBracket Expression RBracket
518             | LBracket RBracket
519              
520             # Depending on context, "{}" may be interpreted as an empty block or a hash literal.
521             LitHashEmpty ::= LBrace RBrace name => LitHash
522             LitHashNonEmpty ::= LBrace Expression RBrace name => LitHash
523              
524             LitString ::= SingleQuote NonSingleOrEscapedQuote_Many SingleQuote
525             | SingleQuote SingleQuote
526              
527             InterpolString ::= DoubleQuote NonDoubleOrEscapedQuote_Many DoubleQuote
528             | DoubleQuote DoubleQuote
529              
530             ArrowRHS ::= ArrowDerefCall
531             | ArrowDerefVariable
532             | ArrowMethodCall
533             | ArrowIndirectCall
534             | ElemSeq1
535              
536             ArrowDerefCall ::= CallArgs
537             ArrowDerefVariable ::= DerefVariableArgsAll
538             | DerefVariableSlice
539             ArrowMethodCall ::= SubNameExpr CallArgs
540             | SubNameExpr
541             ArrowIndirectCall ::= SigilScalar VarIdentExpr CallArgs
542              
543             DerefVariableArgsAll ::= '$*' | '@*' | '%*' | '&*' | '**' | '$#*'
544              
545             DerefVariableSlice ::= '@[' Expression ']'
546             | '@{' Expression '}'
547             | '%[' Expression ']'
548             | '%{' Expression '}'
549              
550             DerefVariable ::= SigilScalar BlockNonEmpty
551             | SigilArray BlockNonEmpty ElemSeq0
552             | SigilHash BlockNonEmpty ElemSeq0
553             | SigilGlob BlockNonEmpty
554             | SigilArrayTop BlockNonEmpty
555              
556             OpNullaryKeywordExpr ::=
557             OpKeywordBreakExpr
558             | OpKeywordForkExpr
559             | OpKeywordGetloginExpr
560             | OpKeywordGetppidExpr
561             | OpKeywordGetpwentExpr
562             | OpKeywordGetgrentExpr
563             | OpKeywordGethostentExpr
564             | OpKeywordGetnetentExpr
565             | OpKeywordGetprotoentExpr
566             | OpKeywordGetserventExpr
567             | OpKeywordSetpwentExpr
568             | OpKeywordSetgrentExpr
569             | OpKeywordEndpwentExpr
570             | OpKeywordEndgrentExpr
571             | OpKeywordEndhostentExpr
572             | OpKeywordEndnetentExpr
573             | OpKeywordEndprotoentExpr
574             | OpKeywordEndserventExpr
575             | OpKeywordEvalExpr
576             | OpKeywordSubExpr
577             | OpKeywordTimeExpr
578             | OpKeywordTimesExpr
579             | OpKeywordWaitExpr
580             | OpKeywordWantarrayExpr
581              
582             # Unary keyword operators:
583             # abs $a, $b => ((abs $a), $b)
584             # abs $a = $b => ((abs $a) = $b)
585             # List keyword operators:
586             # push $a, $b => (push ($a, $b))
587             # push $a = $b => (push ($a = $b))
588             # Assign keyword operators:
589             # goto $a, $b => ((goto $a), $b)
590             # goto $a = $b => (goto ($a = $b))
591              
592             OpUnaryKeywordExpr ::=
593             OpKeywordAbsExpr
594             | OpKeywordAlarmExpr
595             | OpKeywordCallerExpr
596             | OpKeywordChdirExpr
597             | OpKeywordChompExpr
598             | OpKeywordChopExpr
599             | OpKeywordChrExpr
600             | OpKeywordChrootExpr
601             | OpKeywordCloseExpr
602             | OpKeywordClosedirExpr
603             | OpKeywordCosExpr
604             | OpKeywordDbmcloseExpr
605             | OpKeywordDefinedExpr
606             | OpKeywordDeleteExpr
607             | OpKeywordDoExpr
608             | OpKeywordEachExpr
609             | OpKeywordEofExpr
610             | OpKeywordEvalbytesExpr
611             | OpKeywordExistsExpr
612             | OpKeywordExitExpr
613             | OpKeywordExpExpr
614             | OpKeywordFcExpr
615             | OpKeywordFilenoExpr
616             | OpKeywordGetcExpr
617             | OpKeywordGetpeernameExpr
618             | OpKeywordGetpgrpExpr
619             | OpKeywordGetpwnamExpr
620             | OpKeywordGetgrnamExpr
621             | OpKeywordGethostbynameExpr
622             | OpKeywordGetnetbynameExpr
623             | OpKeywordGetprotobynameExpr
624             | OpKeywordGetpwuidExpr
625             | OpKeywordGetgrgidExpr
626             | OpKeywordGetprotobynumberExpr
627             | OpKeywordSethostentExpr
628             | OpKeywordSetnetentExpr
629             | OpKeywordSetprotoentExpr
630             | OpKeywordSetserventExpr
631             | OpKeywordGetsocknameExpr
632             | OpKeywordGmtimeExpr
633             | OpKeywordHexExpr
634             | OpKeywordIntExpr
635             | OpKeywordKeysExpr
636             | OpKeywordLcExpr
637             | OpKeywordLcfirstExpr
638             | OpKeywordLengthExpr
639             | OpKeywordLocaltimeExpr
640             | OpKeywordLockExpr
641             | OpKeywordLogExpr
642             | OpKeywordLstatExpr
643             | OpKeywordOctExpr
644             | OpKeywordOrdExpr
645             | OpKeywordPopExpr
646             | OpKeywordPosExpr
647             | OpKeywordPrototypeExpr
648             | OpKeywordQuotemetaExpr
649             | OpKeywordRandExpr
650             | OpKeywordReaddirExpr
651             | OpKeywordReadlineExpr
652             | OpKeywordReadlinkExpr
653             | OpKeywordReadpipeExpr
654             | OpKeywordRefExpr
655             | OpKeywordResetExpr
656             | OpKeywordRewinddirExpr
657             | OpKeywordRmdirExpr
658             | OpKeywordScalarExpr
659             | OpKeywordShiftExpr
660             | OpKeywordSinExpr
661             | OpKeywordSleepExpr
662             | OpKeywordSqrtExpr
663             | OpKeywordSrandExpr
664             | OpKeywordStatExpr
665             | OpKeywordStudyExpr
666             | OpKeywordTellExpr
667             | OpKeywordTelldirExpr
668             | OpKeywordTiedExpr
669             | OpKeywordUcExpr
670             | OpKeywordUcfirstExpr
671             | OpKeywordUmaskExpr
672             | OpKeywordUndefExpr
673             | OpKeywordUnlinkExpr
674             | OpKeywordUntieExpr
675             | OpKeywordUtimeExpr
676             | OpKeywordValuesExpr
677             | OpFileExpr
678              
679             OpListKeywordExpr ::=
680             OpKeywordAcceptExpr
681             | OpKeywordAtan2Expr
682             | OpKeywordBindExpr
683             | OpKeywordBinmodeExpr
684             | OpKeywordBlessExpr
685             | OpKeywordChmodExpr
686             | OpKeywordChownExpr
687             | OpKeywordConnectExpr
688             | OpKeywordCryptExpr
689             | OpKeywordDbmopenExpr
690             | OpKeywordDieExpr
691             | OpKeywordFcntlExpr
692             | OpKeywordFlockExpr
693             | OpKeywordGetpriorityExpr
694             | OpKeywordGetservbynameExpr
695             | OpKeywordGethostbyaddrExpr
696             | OpKeywordGetnetbyaddrExpr
697             | OpKeywordGetservbyportExpr
698             | OpKeywordExecExpr
699             | OpKeywordGetsockoptExpr
700             | OpKeywordGlobExpr
701             | OpKeywordGrepExpr
702             | OpKeywordIndexExpr
703             | OpKeywordIoctlExpr
704             | OpKeywordJoinExpr
705             | OpKeywordKillExpr
706             | OpKeywordLinkExpr
707             | OpKeywordListenExpr
708             | OpKeywordMapExpr
709             | OpKeywordMkdirExpr
710             | OpKeywordMsgctlExpr
711             | OpKeywordMsggetExpr
712             | OpKeywordMsgrcvExpr
713             | OpKeywordMsgsndExpr
714             | OpKeywordOpenExpr
715             | OpKeywordOpendirExpr
716             | OpKeywordPackExpr
717             | OpKeywordPipeExpr
718             | OpKeywordPrintExpr
719             | OpKeywordPrintfExpr
720             | OpKeywordPushExpr
721             | OpKeywordReadExpr
722             | OpKeywordRecvExpr
723             | OpKeywordRenameExpr
724             | OpKeywordReturnExpr
725             | OpKeywordReverseExpr
726             | OpKeywordRindexExpr
727             | OpKeywordSayExpr
728             | OpKeywordSeekExpr
729             | OpKeywordSeekdirExpr
730             | OpKeywordSelectExpr
731             | OpKeywordSemctlExpr
732             | OpKeywordSemgetExpr
733             | OpKeywordSemopExpr
734             | OpKeywordSendExpr
735             | OpKeywordSetpgrpExpr
736             | OpKeywordSetpriorityExpr
737             | OpKeywordSetsockoptExpr
738             | OpKeywordShmctlExpr
739             | OpKeywordShmgetExpr
740             | OpKeywordShmreadExpr
741             | OpKeywordShmwriteExpr
742             | OpKeywordShutdownExpr
743             | OpKeywordSocketExpr
744             | OpKeywordSocketpairExpr
745             | OpKeywordSortExpr
746             | OpKeywordSpliceExpr
747             | OpKeywordSplitExpr
748             | OpKeywordSprintfExpr
749             | OpKeywordSubstrExpr
750             | OpKeywordSymlinkExpr
751             | OpKeywordSyscallExpr
752             | OpKeywordSysopenExpr
753             | OpKeywordSysreadExpr
754             | OpKeywordSysseekExpr
755             | OpKeywordSyswriteExpr
756             | OpKeywordSystemExpr
757             | OpKeywordTieExpr
758             | OpKeywordTruncateExpr
759             | OpKeywordUnpackExpr
760             | OpKeywordUnshiftExpr
761             | OpKeywordVecExpr
762             | OpKeywordWaitpidExpr
763             | OpKeywordWarnExpr
764             | OpKeywordWriteExpr
765              
766             OpAssignKeywordExpr ::=
767             OpKeywordDumpExpr
768             | OpKeywordGotoExpr
769             | OpKeywordLastExpr
770             | OpKeywordNextExpr
771             | OpKeywordRedoExpr
772              
773             OpKeywordAbsExpr ::= OpKeywordAbs OpUnaryKeywordArg
774             | OpKeywordAbs
775              
776             OpKeywordAcceptExpr ::= OpKeywordAccept OpListKeywordArg
777              
778             OpKeywordAlarmExpr ::= OpKeywordAlarm OpUnaryKeywordArg
779             | OpKeywordAlarm
780              
781             OpKeywordAtan2Expr ::= OpKeywordAtan2 OpListKeywordArg
782              
783             OpKeywordBindExpr ::= OpKeywordBind OpListKeywordArg
784              
785             OpKeywordBinmodeExpr ::= OpKeywordBinmode OpListKeywordArg
786              
787             OpKeywordBlessExpr ::= OpKeywordBless OpListKeywordArg
788              
789             OpKeywordBreakExpr ::= OpKeywordBreak Label
790             | OpKeywordBreak
791              
792             OpKeywordCallerExpr ::= OpKeywordCaller OpUnaryKeywordArg
793             | OpKeywordCaller
794              
795             OpKeywordChdirExpr ::= OpKeywordChdir OpUnaryKeywordArg
796             | OpKeywordChdir
797              
798             OpKeywordChmodExpr ::= OpKeywordChmod OpListKeywordArg
799              
800             OpKeywordChompExpr ::= OpKeywordChomp OpUnaryKeywordArg
801             | OpKeywordChomp
802              
803             OpKeywordChopExpr ::= OpKeywordChop OpUnaryKeywordArg
804             | OpKeywordChop
805              
806             OpKeywordChownExpr ::= OpKeywordChown OpListKeywordArg
807              
808             OpKeywordChrExpr ::= OpKeywordChr OpUnaryKeywordArg
809             | OpKeywordChr
810              
811             OpKeywordChrootExpr ::= OpKeywordChroot OpUnaryKeywordArg
812             | OpKeywordChroot
813              
814             OpKeywordCloseExpr ::= OpKeywordClose OpUnaryKeywordArg
815             | OpKeywordClose
816              
817             OpKeywordClosedirExpr ::= OpKeywordClosedir OpUnaryKeywordArg
818              
819             OpKeywordConnectExpr ::= OpKeywordConnect OpListKeywordArg
820              
821             OpKeywordCosExpr ::= OpKeywordCos OpUnaryKeywordArg
822              
823             OpKeywordCryptExpr ::= OpKeywordCrypt OpListKeywordArg
824              
825             OpKeywordDbmcloseExpr ::= OpKeywordDbmclose OpUnaryKeywordArg
826              
827             OpKeywordDbmopenExpr ::= OpKeywordDbmopen OpListKeywordArg
828              
829             OpKeywordDefinedExpr ::= OpKeywordDefined OpUnaryKeywordArg
830             | OpKeywordDefined
831              
832             OpKeywordDeleteExpr ::= OpKeywordDelete OpUnaryKeywordArg
833              
834             OpKeywordDieExpr ::= OpKeywordDie OpListKeywordArg
835              
836             OpKeywordDoExpr ::= OpKeywordDo BlockNonEmpty
837             | OpKeywordDo OpUnaryKeywordArgNonBrace
838              
839             OpKeywordDumpExpr ::= OpKeywordDump OpAssignKeywordArg
840             | OpKeywordDump Label
841             | OpKeywordDump
842              
843             OpKeywordEachExpr ::= OpKeywordEach OpUnaryKeywordArg
844              
845             OpKeywordEofExpr ::= OpKeywordEof OpUnaryKeywordArg
846             | OpKeywordEof
847              
848             OpKeywordEvalExpr ::= OpKeywordEval BlockNonEmpty
849              
850             OpKeywordEvalbytesExpr ::= OpKeywordEvalbytes OpUnaryKeywordArg
851             | OpKeywordEvalbytes
852              
853             OpKeywordExistsExpr ::= OpKeywordExists OpUnaryKeywordArg
854              
855             OpKeywordExitExpr ::= OpKeywordExit OpUnaryKeywordArg
856             | OpKeywordExit
857              
858             OpKeywordExpExpr ::= OpKeywordExp OpUnaryKeywordArg
859             | OpKeywordExp
860              
861             OpKeywordFcExpr ::= OpKeywordFc OpUnaryKeywordArg
862             | OpKeywordFc
863              
864             OpKeywordFcntlExpr ::= OpKeywordFcntl OpListKeywordArg
865              
866             OpKeywordFilenoExpr ::= OpKeywordFileno OpUnaryKeywordArg
867              
868             OpKeywordFlockExpr ::= OpKeywordFlock OpListKeywordArg
869              
870             OpKeywordForkExpr ::= OpKeywordFork
871              
872             OpKeywordGetcExpr ::= OpKeywordGetc OpUnaryKeywordArg
873             | OpKeywordGetc
874              
875             OpKeywordGetloginExpr ::= OpKeywordGetlogin
876              
877             OpKeywordGetpeernameExpr ::= OpKeywordGetpeername OpUnaryKeywordArg
878              
879             OpKeywordGetpgrpExpr ::= OpKeywordGetpgrp OpUnaryKeywordArg
880              
881             OpKeywordGetppidExpr ::= OpKeywordGetppid
882              
883             OpKeywordGetpriorityExpr ::= OpKeywordGetpriority OpListKeywordArg
884              
885             OpKeywordGetpwnamExpr ::= OpKeywordGetpwnam OpUnaryKeywordArg
886              
887             OpKeywordGetgrnamExpr ::= OpKeywordGetgrnam OpUnaryKeywordArg
888              
889             OpKeywordGethostbynameExpr ::= OpKeywordGethostbyname OpUnaryKeywordArg
890              
891             OpKeywordGetnetbynameExpr ::= OpKeywordGetnetbyname OpUnaryKeywordArg
892              
893             OpKeywordGetprotobynameExpr ::= OpKeywordGetprotobyname OpUnaryKeywordArg
894              
895             OpKeywordGetpwuidExpr ::= OpKeywordGetpwuid OpUnaryKeywordArg
896              
897             OpKeywordGetgrgidExpr ::= OpKeywordGetgrgid OpUnaryKeywordArg
898              
899             OpKeywordGetservbynameExpr ::= OpKeywordGetservbyname OpListKeywordArg
900              
901             OpKeywordGethostbyaddrExpr ::= OpKeywordGethostbyaddr OpListKeywordArg
902              
903             OpKeywordGetnetbyaddrExpr ::= OpKeywordGetnetbyaddr OpListKeywordArg
904              
905             OpKeywordGetprotobynumberExpr ::= OpKeywordGetprotobynumber OpUnaryKeywordArg
906              
907             OpKeywordGetservbyportExpr ::= OpKeywordGetservbyport OpListKeywordArg
908              
909             OpKeywordGetpwentExpr ::= OpKeywordGetpwent
910              
911             OpKeywordGetgrentExpr ::= OpKeywordGetgrent
912              
913             OpKeywordGethostentExpr ::= OpKeywordGethostent
914              
915             OpKeywordGetnetentExpr ::= OpKeywordGetnetent
916              
917             OpKeywordGetprotoentExpr ::= OpKeywordGetprotoent
918              
919             OpKeywordGetserventExpr ::= OpKeywordGetservent
920              
921             OpKeywordSetpwentExpr ::= OpKeywordSetpwent
922              
923             OpKeywordSetgrentExpr ::= OpKeywordSetgrent
924              
925             OpKeywordSethostentExpr ::= OpKeywordSethostent OpUnaryKeywordArg
926              
927             OpKeywordSetnetentExpr ::= OpKeywordSetnetent OpUnaryKeywordArg
928              
929             OpKeywordSetprotoentExpr ::= OpKeywordSetprotoent OpUnaryKeywordArg
930              
931             OpKeywordSetserventExpr ::= OpKeywordSetservent OpUnaryKeywordArg
932              
933             OpKeywordEndpwentExpr ::= OpKeywordEndpwent
934              
935             OpKeywordEndgrentExpr ::= OpKeywordEndgrent
936              
937             OpKeywordEndhostentExpr ::= OpKeywordEndhostent
938              
939             OpKeywordEndnetentExpr ::= OpKeywordEndnetent
940              
941             OpKeywordEndprotoentExpr ::= OpKeywordEndprotoent
942              
943             OpKeywordEndserventExpr ::= OpKeywordEndservent
944              
945             OpKeywordExecExpr ::= OpKeywordExec BlockNonEmpty OpListKeywordArg
946             | OpKeywordExec OpListKeywordArgNonBrace
947              
948             OpKeywordGetsocknameExpr ::= OpKeywordGetsockname OpUnaryKeywordArg
949              
950             OpKeywordGetsockoptExpr ::= OpKeywordGetsockopt OpListKeywordArg
951              
952             OpKeywordGlobExpr ::= OpKeywordGlob OpListKeywordArg
953             | OpKeywordGlob
954              
955             OpKeywordGmtimeExpr ::= OpKeywordGmtime OpUnaryKeywordArg
956             | OpKeywordGmtime
957              
958             # &NAME is an expression too
959             OpKeywordGotoExpr ::= OpKeywordGoto OpAssignKeywordArg
960             | OpKeywordGoto Label
961              
962             OpKeywordGrepExpr ::= OpKeywordGrep BlockNonEmpty OpListKeywordArg
963             | OpKeywordGrep OpListKeywordArgNonBrace
964              
965             OpKeywordHexExpr ::= OpKeywordHex OpUnaryKeywordArg
966             | OpKeywordHex
967              
968             OpKeywordIndexExpr ::= OpKeywordIndex OpListKeywordArg
969              
970             OpKeywordIntExpr ::= OpKeywordInt OpUnaryKeywordArg
971             | OpKeywordInt
972              
973             OpKeywordIoctlExpr ::= OpKeywordIoctl OpListKeywordArg
974              
975             OpKeywordJoinExpr ::= OpKeywordJoin OpListKeywordArg
976              
977             OpKeywordKeysExpr ::= OpKeywordKeys OpUnaryKeywordArg
978              
979             OpKeywordKillExpr ::= OpKeywordKill OpListKeywordArg
980             | OpKeywordKill Expression
981              
982             OpKeywordLastExpr ::= OpKeywordLast OpAssignKeywordArg
983             | OpKeywordLast Label
984             | OpKeywordLast
985              
986             OpKeywordLcExpr ::= OpKeywordLc OpUnaryKeywordArg
987             | OpKeywordLc
988              
989             OpKeywordLcfirstExpr ::= OpKeywordLcfirst OpUnaryKeywordArg
990             | OpKeywordLcfirst
991              
992             OpKeywordLengthExpr ::= OpKeywordLength OpUnaryKeywordArg
993             | OpKeywordLength
994              
995             OpKeywordLinkExpr ::= OpKeywordLink OpListKeywordArg
996              
997             OpKeywordListenExpr ::= OpKeywordListen OpListKeywordArg
998              
999             OpKeywordLocaltimeExpr ::= OpKeywordLocaltime OpUnaryKeywordArg
1000             | OpKeywordLocaltime
1001              
1002             OpKeywordLockExpr ::= OpKeywordLock OpUnaryKeywordArg
1003              
1004             OpKeywordLogExpr ::= OpKeywordLog OpUnaryKeywordArg
1005             | OpKeywordLog
1006              
1007             OpKeywordLstatExpr ::= OpKeywordLstat OpUnaryKeywordArg
1008             | OpKeywordLstat
1009              
1010             OpKeywordMapExpr ::= OpKeywordMap BlockNonEmpty OpListKeywordArg
1011             | OpKeywordMap OpListKeywordArgNonBrace
1012              
1013             OpKeywordMkdirExpr ::= OpKeywordMkdir OpListKeywordArg
1014             | OpKeywordMkdir
1015              
1016             OpKeywordMsgctlExpr ::= OpKeywordMsgctl OpListKeywordArg
1017              
1018             OpKeywordMsggetExpr ::= OpKeywordMsgget OpListKeywordArg
1019              
1020             OpKeywordMsgrcvExpr ::= OpKeywordMsgrcv OpListKeywordArg
1021              
1022             OpKeywordMsgsndExpr ::= OpKeywordMsgsnd OpListKeywordArg
1023              
1024             OpKeywordNextExpr ::= OpKeywordNext OpAssignKeywordArg
1025             | OpKeywordNext Label
1026             | OpKeywordNext
1027              
1028             OpKeywordOctExpr ::= OpKeywordOct OpUnaryKeywordArg
1029             | OpKeywordOct
1030              
1031             OpKeywordOpenExpr ::= OpKeywordOpen OpListKeywordArg
1032              
1033             OpKeywordOpendirExpr ::= OpKeywordOpendir OpListKeywordArg
1034              
1035             OpKeywordOrdExpr ::= OpKeywordOrd OpUnaryKeywordArg
1036             | OpKeywordOrd
1037              
1038             OpKeywordPackExpr ::= OpKeywordPack OpListKeywordArg
1039              
1040             OpKeywordPipeExpr ::= OpKeywordPipe OpListKeywordArg
1041              
1042             OpKeywordPopExpr ::= OpKeywordPop OpUnaryKeywordArg
1043             | OpKeywordPop
1044              
1045             OpKeywordPosExpr ::= OpKeywordPos OpUnaryKeywordArg
1046             | OpKeywordPos
1047              
1048             OpKeywordPrintExpr ::= OpKeywordPrint BlockNonEmpty OpListKeywordArg
1049             | OpKeywordPrint BuiltinFilehandle OpListKeywordArgNonBrace
1050             | OpKeywordPrint BuiltinFilehandle
1051             | OpKeywordPrint OpListKeywordArgNonBrace
1052             | OpKeywordPrint BlockNonEmpty
1053             | OpKeywordPrint
1054              
1055             OpKeywordPrintfExpr ::= OpKeywordPrintf BlockNonEmpty OpListKeywordArg
1056             | OpKeywordPrintf BuiltinFilehandle OpListKeywordArgNonBrace
1057             | OpKeywordPrintf BuiltinFilehandle
1058             | OpKeywordPrintf OpListKeywordArgNonBrace
1059             | OpKeywordPrintf BlockNonEmpty
1060              
1061             OpKeywordPrototypeExpr ::= OpKeywordPrototype OpUnaryKeywordArg
1062             | OpKeywordPrototype
1063              
1064             OpKeywordPushExpr ::= OpKeywordPush OpListKeywordArg
1065              
1066             OpKeywordQuotemetaExpr ::= OpKeywordQuotemeta OpUnaryKeywordArg
1067             | OpKeywordQuotemeta
1068              
1069             OpKeywordRandExpr ::= OpKeywordRand OpUnaryKeywordArg
1070             | OpKeywordRand
1071              
1072             OpKeywordReadExpr ::= OpKeywordRead OpListKeywordArg
1073              
1074             OpKeywordReaddirExpr ::= OpKeywordReaddir OpUnaryKeywordArg
1075              
1076             OpKeywordReadlineExpr ::= OpKeywordReadline OpUnaryKeywordArg
1077             | OpKeywordReadline
1078              
1079             OpKeywordReadlinkExpr ::= OpKeywordReadlink OpUnaryKeywordArg
1080             | OpKeywordReadlink
1081              
1082             OpKeywordReadpipeExpr ::= OpKeywordReadpipe OpUnaryKeywordArg
1083             | OpKeywordReadpipe
1084              
1085             OpKeywordRecvExpr ::= OpKeywordRecv OpListKeywordArg
1086              
1087             OpKeywordRedoExpr ::= OpKeywordRedo OpAssignKeywordArg
1088             | OpKeywordRedo Label
1089             | OpKeywordRedo
1090              
1091             OpKeywordRefExpr ::= OpKeywordRef OpUnaryKeywordArg
1092             | OpKeywordRef
1093              
1094             OpKeywordRenameExpr ::= OpKeywordRename OpListKeywordArg
1095              
1096             OpKeywordResetExpr ::= OpKeywordReset OpUnaryKeywordArg
1097             | OpKeywordReset
1098              
1099             OpKeywordReturnExpr ::= OpKeywordReturn OpListKeywordArg
1100             | OpKeywordReturn
1101              
1102             OpKeywordReverseExpr ::= OpKeywordReverse OpListKeywordArg
1103              
1104             OpKeywordRewinddirExpr ::= OpKeywordRewinddir OpUnaryKeywordArg
1105             | OpKeywordRewinddir
1106              
1107             OpKeywordRindexExpr ::= OpKeywordRindex OpListKeywordArg
1108             | OpKeywordRindex
1109              
1110             OpKeywordRmdirExpr ::= OpKeywordRmdir OpUnaryKeywordArg
1111             | OpKeywordRmdir
1112              
1113             OpKeywordSayExpr ::= OpKeywordSay BlockNonEmpty OpListKeywordArg
1114             | OpKeywordSay BuiltinFilehandle OpListKeywordArgNonBrace
1115             | OpKeywordSay BuiltinFilehandle
1116             | OpKeywordSay OpListKeywordArgNonBrace
1117             | OpKeywordSay BlockNonEmpty
1118             | OpKeywordSay
1119              
1120             OpKeywordScalarExpr ::= OpKeywordScalar OpUnaryKeywordArg
1121              
1122             OpKeywordSeekExpr ::= OpKeywordSeek OpListKeywordArg
1123              
1124             OpKeywordSeekdirExpr ::= OpKeywordSeekdir OpListKeywordArg
1125              
1126             OpKeywordSelectExpr ::= OpKeywordSelect OpListKeywordArg
1127              
1128             OpKeywordSemctlExpr ::= OpKeywordSemctl OpListKeywordArg
1129              
1130             OpKeywordSemgetExpr ::= OpKeywordSemget OpListKeywordArg
1131              
1132             OpKeywordSemopExpr ::= OpKeywordSemop OpListKeywordArg
1133              
1134             OpKeywordSendExpr ::= OpKeywordSend OpListKeywordArg
1135              
1136             OpKeywordSetpgrpExpr ::= OpKeywordSetpgrp OpListKeywordArg
1137              
1138             OpKeywordSetpriorityExpr ::= OpKeywordSetpriority OpListKeywordArg
1139              
1140             OpKeywordSetsockoptExpr ::= OpKeywordSetsockopt OpListKeywordArg
1141              
1142             OpKeywordShiftExpr ::= OpKeywordShift OpUnaryKeywordArg
1143             | OpKeywordShift
1144              
1145             OpKeywordShmctlExpr ::= OpKeywordShmctl OpListKeywordArg
1146              
1147             OpKeywordShmgetExpr ::= OpKeywordShmget OpListKeywordArg
1148              
1149             OpKeywordShmreadExpr ::= OpKeywordShmread OpListKeywordArg
1150              
1151             OpKeywordShmwriteExpr ::= OpKeywordShmwrite OpListKeywordArg
1152              
1153             OpKeywordShutdownExpr ::= OpKeywordShutdown OpListKeywordArg
1154              
1155             OpKeywordSinExpr ::= OpKeywordSin OpUnaryKeywordArg
1156             | OpKeywordSin
1157              
1158             OpKeywordSleepExpr ::= OpKeywordSleep OpUnaryKeywordArg
1159             | OpKeywordSleep
1160              
1161             OpKeywordSocketExpr ::= OpKeywordSocket OpListKeywordArg
1162              
1163             OpKeywordSocketpairExpr ::= OpKeywordSocketpair OpListKeywordArg
1164              
1165             OpKeywordSortExpr ::= OpKeywordSort BlockNonEmpty OpListKeywordArg
1166             | OpKeywordSort VarScalar OpListKeywordArg
1167             | OpKeywordSort OpListKeywordArgNonBrace
1168              
1169             OpKeywordSpliceExpr ::= OpKeywordSplice OpListKeywordArg
1170              
1171             OpKeywordSplitExpr ::= OpKeywordSplit OpListKeywordArg
1172              
1173             OpKeywordSprintfExpr ::= OpKeywordSprintf OpListKeywordArg
1174              
1175             OpKeywordSqrtExpr ::= OpKeywordSqrt OpUnaryKeywordArg
1176             | OpKeywordSqrt
1177              
1178             OpKeywordSrandExpr ::= OpKeywordSrand OpUnaryKeywordArg
1179             | OpKeywordSrand
1180              
1181             OpKeywordStatExpr ::= OpKeywordStat OpUnaryKeywordArg
1182             | OpKeywordStat
1183              
1184             OpKeywordStudyExpr ::= OpKeywordStudy OpUnaryKeywordArg
1185             | OpKeywordStudy
1186              
1187             OpKeywordSubExpr ::= OpKeywordSub SubDefinition
1188              
1189             OpKeywordSubstrExpr ::= OpKeywordSubstr OpListKeywordArg
1190              
1191             OpKeywordSymlinkExpr ::= OpKeywordSymlink OpListKeywordArg
1192              
1193             OpKeywordSyscallExpr ::= OpKeywordSyscall OpListKeywordArg
1194              
1195             OpKeywordSysopenExpr ::= OpKeywordSysopen OpListKeywordArg
1196              
1197             OpKeywordSysreadExpr ::= OpKeywordSysread OpListKeywordArg
1198              
1199             OpKeywordSysseekExpr ::= OpKeywordSysseek OpListKeywordArg
1200              
1201             OpKeywordSyswriteExpr ::= OpKeywordSyswrite OpListKeywordArg
1202              
1203             OpKeywordSystemExpr ::= OpKeywordSystem BlockNonEmpty OpListKeywordArg
1204             | OpKeywordSystem OpListKeywordArgNonBrace
1205              
1206             OpKeywordTellExpr ::= OpKeywordTell OpUnaryKeywordArg
1207             | OpKeywordTell
1208              
1209             OpKeywordTelldirExpr ::= OpKeywordTelldir OpUnaryKeywordArg
1210              
1211             OpKeywordTieExpr ::= OpKeywordTie OpListKeywordArg
1212              
1213             OpKeywordTiedExpr ::= OpKeywordTied OpUnaryKeywordArg
1214              
1215             OpKeywordTimeExpr ::= OpKeywordTime
1216              
1217             OpKeywordTimesExpr ::= OpKeywordTimes
1218              
1219             OpKeywordTruncateExpr ::= OpKeywordTruncate OpListKeywordArg
1220              
1221             OpKeywordUcExpr ::= OpKeywordUc OpUnaryKeywordArg
1222             | OpKeywordUc
1223              
1224             OpKeywordUcfirstExpr ::= OpKeywordUcfirst OpUnaryKeywordArg
1225             | OpKeywordUcfirst
1226              
1227             OpKeywordUmaskExpr ::= OpKeywordUmask OpUnaryKeywordArg
1228             | OpKeywordUmask
1229              
1230             OpKeywordUndefExpr ::= OpKeywordUndef OpUnaryKeywordArg
1231             | OpKeywordUndef
1232              
1233             OpKeywordUnlinkExpr ::= OpKeywordUnlink OpUnaryKeywordArg
1234             | OpKeywordUnlink
1235              
1236             OpKeywordUnpackExpr ::= OpKeywordUnpack OpListKeywordArg
1237              
1238             OpKeywordUnshiftExpr ::= OpKeywordUnshift OpListKeywordArg
1239              
1240             OpKeywordUntieExpr ::= OpKeywordUntie OpUnaryKeywordArg
1241              
1242             OpKeywordUtimeExpr ::= OpKeywordUtime OpUnaryKeywordArg
1243              
1244             OpKeywordValuesExpr ::= OpKeywordValues OpUnaryKeywordArg
1245              
1246             OpKeywordVecExpr ::= OpKeywordVec OpListKeywordArg
1247              
1248             OpKeywordWaitExpr ::= OpKeywordWait
1249              
1250             OpKeywordWaitpidExpr ::= OpKeywordWaitpid OpListKeywordArg
1251              
1252             OpKeywordWantarrayExpr ::= OpKeywordWantarray
1253              
1254             OpKeywordWarnExpr ::= OpKeywordWarn OpListKeywordArg
1255             | OpKeywordWarn
1256              
1257             OpKeywordWriteExpr ::= OpKeywordWrite OpListKeywordArg
1258             | OpKeywordWrite
1259              
1260             OpFile ::=
1261             OpFileReadableEffective
1262             | OpFileWritableEffective
1263             | OpFileRExecutableEffective
1264             | OpFileOwnedEffective
1265             | OpFileReadableReal
1266             | OpFileWritableReal
1267             | OpFileRExecutableReal
1268             | OpFileOwnedReal
1269             | OpFileExists
1270             | OpFileEmpty
1271             | OpFileNonEmpty
1272             | OpFilePlain
1273             | OpFileDirectory
1274             | OpFileSymbolic
1275             | OpFileNamedPipe
1276             | OpFileSocket
1277             | OpFileBlock
1278             | OpFileCharacter
1279             | OpFileOpenedTty
1280             | OpFileSetuid
1281             | OpFileSetgid
1282             | OpFileSticky
1283             | OpFileAsciiUtf8
1284             | OpFileBinary
1285             | OpFileStartTime
1286             | OpFileAccessTime
1287             | OpFileChangeTime
1288              
1289             OpFileExpr ::= OpFile OpFileArg
1290             OpFileArg ::= OpUnaryKeywordArg
1291             | BuiltinFilehandle
1292              
1293             QLikeValue ::= QLikeValueExpr | QLikeValueExprWithMods
1294              
1295             QLikeValueExpr
1296             ~ QLikeFunction '(' NonRParenOrEscapedParens_Any ')'
1297             | QLikeFunction '{' NonRBraceOrEscapedBraces_Any '}'
1298             | QLikeFunction '<' NonRAngleOrEscapedAngles_Any '>'
1299             | QLikeFunction '[' NonRBracketOrEscapedBrackets_Any ']'
1300             | QLikeFunction '/' NonForwardSlashOrEscapedForwardSlashes_Any '/'
1301             | QLikeFunction '!' NonExclamPointOrEscapedExclamPoints_Any '!'
1302             | QLikeFunction '|' NonPipeOrEscapedPipes_Any '|'
1303              
1304             QLikeFunction ~ OpKeywordQ
1305             | OpKeywordQq
1306             | OpKeywordQx
1307             | OpKeywordQw
1308              
1309             # Here we begin with "qr//" and "m//" which can have parameters
1310             # Then we continue with "s///", "tr///", and "y///" which have two args, not one
1311             # "//" follow at the end
1312             QLikeValueExprWithMods
1313             ~ QLikeFunctionWithMods '(' NonRParenOrEscapedParens_Any ')' RegexModifiers
1314             | QLikeFunctionWithMods '{' NonRBraceOrEscapedBraces_Any '}' RegexModifiers
1315             | QLikeFunctionWithMods '<' NonRAngleOrEscapedAngles_Any '>' RegexModifiers
1316             | QLikeFunctionWithMods '[' NonRBracketOrEscapedBrackets_Any ']' RegexModifiers
1317             | QLikeFunctionWithMods '/' NonForwardSlashOrEscapedForwardSlashes_Any '/' RegexModifiers
1318             | QLikeFunctionWithMods '!' NonExclamPointOrEscapedExclamPoints_Any '!' RegexModifiers
1319             | QLikeFunctionWithMods '|' NonPipeOrEscapedPipes_Any '|' RegexModifiers
1320             | QLikeSubstWithMods '(' NonRParenOrEscapedParens_Any ')(' NonRParenOrEscapedParens_Any ')' RegexModifiers
1321             | QLikeSubstWithMods '{' NonRBraceOrEscapedBraces_Any '}{' NonRBraceOrEscapedBraces_Any '}' RegexModifiers
1322             | QLikeSubstWithMods '<' NonRAngleOrEscapedAngles_Any '><' NonRAngleOrEscapedAngles_Any '>' RegexModifiers
1323             | QLikeSubstWithMods '[' NonRBracketOrEscapedBrackets_Any '][' NonRBracketOrEscapedBrackets_Any ']' RegexModifiers
1324             | QLikeSubstWithMods '/' NonForwardSlashOrEscapedForwardSlashes_Any '/' NonForwardSlashOrEscapedForwardSlashes_Any '/' RegexModifiers
1325             | QLikeSubstWithMods '!' NonExclamPointOrEscapedExclamPoints_Any '!' NonExclamPointOrEscapedExclamPoints_Any '!' RegexModifiers
1326             | QLikeSubstWithMods '|' NonPipeOrEscapedPipes_Any '|' NonPipeOrEscapedPipes_Any '|' RegexModifiers
1327             | '/' NonForwardSlashOrEscapedForwardSlashes_Any '/' RegexModifiers
1328             | '`' NonBacktickOrEscapedBackticks_Any '`'
1329              
1330             QLikeFunctionWithMods ~ OpKeywordQr
1331             | OpKeywordM
1332              
1333             QLikeSubstWithMods ~ OpKeywordS
1334             | OpKeywordTr
1335             | OpKeywordY
1336              
1337             RegexModifiers ~ [a-z]*
1338              
1339             ###
1340              
1341             # Everything except: # q* / s / m / y / t*
1342             # | | | | |
1343             # a b c d e f g h i j k l m n o p q r s t u v w x y z
1344             # a - l n - p r u - x z
1345             # (Cannot begin with digit, so digits are out)
1346             NonQLikeLetters ~ [a-ln-pru-xzA-Z_]+
1347              
1348             # Everything except: q / w / r / x (qq, qw, qr, qx)
1349             # | | | |
1350             # a b c d e f g h i j k l m n o p q r s t u v w x y z
1351             # a - p s - v y-z
1352             # (digits also allowed at this point)
1353             NonQRWXLetters ~ [a-ps-vy-zA-Z0-9_]+
1354              
1355             # Everything except: r (tr)
1356             # |
1357             # a b c d e f g h i j k l m n o p q r s t u v w x y z
1358             # a - q s - z
1359             # (digits also allowed at this point)
1360             NonRLetter ~ [a-qs-zA-Z0-9_]
1361              
1362             # Everything else allowed (including digits)
1363             AllSubLetters ~ [a-zA-Z0-9_]+
1364              
1365             IdentComp ~ [a-zA-Z_0-9]+
1366             PackageSep ~ '::'
1367              
1368             VersionExpr ::= VersionNumber
1369             VersionNumber ~ VersionNumberSegments
1370             | 'v' VersionNumberSegments
1371              
1372             VersionNumberSegments ~ VersionNumberSegment '.' VersionNumberSegment '.' VersionNumberSegment
1373             | VersionNumberSegment '.' VersionNumberSegment
1374             | VersionNumberSegment
1375              
1376             VersionNumberSegment ~ [0-9] [0-9] [0-9]
1377             | [0-9] [0-9]
1378             | [0-9]
1379              
1380             LitNumber ::= LitNumberDec
1381             | LitNumberOct
1382             | LitNumberHex
1383             | LitNumberBin
1384              
1385             LitNumberDec ::= NumberDec
1386             LitNumberOct ::= NumberOct
1387             LitNumberHex ::= NumberHex
1388             LitNumberBin ::= NumberBin
1389              
1390             NumberDec ~ NumberDecInt
1391             | NumberDecInt ExpDec
1392             | NumberDecInt '.' DigitsDec
1393             | NumberDecInt '.' DigitsDec ExpDec
1394             | '.' DigitDec DigitsDec
1395             | '.' DigitDec DigitsDec ExpDec
1396              
1397             NumberDecInt ~ [1-9] DigitsDec
1398             | '0'
1399              
1400             NumberOct ~ '0' Underbars DigitOct DigitsOct
1401             | '0' Underbars DigitOct DigitsOct ExpHex
1402             | '0' DigitsOct '.' DigitOct DigitsOct ExpHex
1403              
1404             NumberHex ~ '0' [xX] Underbars DigitHex DigitsHex
1405             | '0' [xX] Underbars DigitHex DigitsHex ExpHex
1406             | '0' [xX] DigitsHex '.' DigitHex DigitsHex ExpHex
1407              
1408             NumberBin ~ '0' [bB] Underbars DigitBin DigitsBin
1409             | '0' [bB] Underbars DigitBin DigitsBin ExpHex
1410             | '0' [bB] DigitsBin '.' DigitBin DigitsBin ExpHex
1411              
1412             ExpDec ~ [eE] [+-] ExpDecExp
1413             | [eE] [_] [+-] ExpDecExp
1414             | [eE] ExpDecExp
1415              
1416             ExpDecExp ~ Underbars DigitDec DigitsDec
1417             Underbars ~ [_]*
1418              
1419             ExpHex ~ [pP] [+-] DigitDec DigitsDec
1420             | [pP] DigitDec DigitsDec
1421              
1422             DigitDec ~ [0-9]
1423             DigitsDec ~ [0-9_]*
1424              
1425             DigitOct ~ [0-7]
1426             DigitsOct ~ [0-7_]*
1427             DigitHex ~ [0-9a-fA-F]
1428             DigitsHex ~ [0-9a-fA-F_]*
1429              
1430             DigitBin ~ [01]
1431             DigitsBin ~ [01_]*
1432              
1433             Digits ~ [0-9]+
1434             SingleQuote ~ [']
1435             DoubleQuote ~ ["]
1436              
1437             NonDoubleOrEscapedQuote_Many ~ NonDoubleOrEscapedQuote+
1438             NonDoubleOrEscapedQuote ~ EscapedDoubleQuote | NonDoubleQuote
1439             EscapedDoubleQuote ~ Escape ["]
1440             NonDoubleQuote ~ [^"]
1441              
1442             NonSingleOrEscapedQuote_Many ~ NonSingleOrEscapedQuote+
1443             NonSingleOrEscapedQuote ~ EscapedSingleQuote | NonSingleQuote
1444             EscapedSingleQuote ~ Escape [']
1445             NonSingleQuote ~ [^']
1446              
1447             Colon ~ ':'
1448             Semicolon ~ ';'
1449             Escape ~ '\'
1450              
1451             SigilScalar ~ '$'
1452             SigilArray ~ '@'
1453             SigilHash ~ '%'
1454             SigilCode ~ '&'
1455             SigilGlob ~ '*'
1456             SigilArrayTop ~ '$#'
1457              
1458             LParen ~ '('
1459             RParen ~ ')'
1460             LBracket ~ '['
1461             RBracket ~ ']'
1462             LBrace ~ '{'
1463             RBrace ~ '}'
1464              
1465             NonRParenOrEscapedParens_Any ~ NonRParenOrEscapedParens*
1466             NonRParenOrEscapedParens ~ EscapedParens | NonRParen
1467             EscapedParens ~ EscapedLParen | EscapedRParen
1468             EscapedLParen ~ Escape [(]
1469             EscapedRParen ~ Escape [)]
1470             NonRParen ~ [^)]
1471              
1472             NonRBracketOrEscapedBrackets_Any ~ NonRBracketOrEscapedBrackets*
1473             NonRBracketOrEscapedBrackets ~ EscapedBrackets | NonRBracket
1474             EscapedBrackets ~ EscapedLBracket | EscapedRBracket
1475             EscapedLBracket ~ Escape [\[]
1476             EscapedRBracket ~ Escape [\]]
1477             NonRBracket ~ [^\]]
1478              
1479             NonRBraceOrEscapedBraces_Any ~ NonRBraceOrEscapedBraces*
1480             NonRBraceOrEscapedBraces ~ EscapedBraces | NonRBrace
1481             EscapedBraces ~ EscapedLBrace | EscapedRBrace
1482             EscapedLBrace ~ Escape [\{]
1483             EscapedRBrace ~ Escape [\}]
1484             NonRBrace ~ [^\}]
1485              
1486             NonRAngleOrEscapedAngles_Any ~ NonRAngleOrEscapedAngles*
1487             NonRAngleOrEscapedAngles ~ EscapedAngles | NonRAngle
1488             EscapedAngles ~ EscapedLAngle | EscapedRAngle
1489             EscapedLAngle ~ Escape [<]
1490             EscapedRAngle ~ Escape [>]
1491             NonRAngle ~ [^>]
1492              
1493             NonForwardSlashOrEscapedForwardSlashes_Any ~ NonForwardSlashOrEscapedForwardSlashes*
1494             NonForwardSlashOrEscapedForwardSlashes ~ EscapedForwardSlash | NonForwardSlash
1495             EscapedForwardSlash ~ Escape [/]
1496             NonForwardSlash ~ [^\/]
1497              
1498             NonExclamPointOrEscapedExclamPoints_Any ~ NonExclamPointOrEscapedExclamPoints*
1499             NonExclamPointOrEscapedExclamPoints ~ EscapedExclamPoint | NonExclamPoint
1500             EscapedExclamPoint ~ Escape [!]
1501             NonExclamPoint ~ [^\!]
1502              
1503             NonPipeOrEscapedPipes_Any ~ NonPipeOrEscapedPipes*
1504             NonPipeOrEscapedPipes ~ EscapedPipe | NonPipe
1505             EscapedPipe ~ Escape [\|]
1506             NonPipe ~ [^\|]
1507              
1508             NonBacktickOrEscapedBackticks_Any ~ NonBacktickOrEscapedBackticks*
1509             NonBacktickOrEscapedBackticks ~ EscapedBacktick | NonBacktick
1510             EscapedBacktick ~ Escape [`]
1511             NonBacktick ~ [^\`]
1512              
1513             Ellipsis ~ '...'
1514              
1515             UnderscorePackage ~ '__PACKAGE__'
1516             UnderscoreFile ~ '__FILE__'
1517             UnderscoreLine ~ '__LINE__'
1518             UnderscoreSub ~ '__SUB__'
1519             #UnderscoreData ~ '__DATA__'
1520             #UnderscoreEnd ~ '__END__'
1521              
1522             PhaseName ~ 'BEGIN' | 'CHECK' | 'INIT' | 'UNITCHECK' | 'END'
1523              
1524             SubAttrArgs ~ '(' NonRParenOrEscapedParens_Any ')'
1525              
1526             OpArrow ~ '->'
1527             OpInc ~ '++' | '--'
1528             OpPower ~ '**'
1529             OpUnary ~ '!' | '~' | '\' | '+' | '-'
1530             OpRegex ~ '=~' | '!~'
1531             OpMulti ~ '*' | '/' | '%' | 'x'
1532             OpAdd ~ '+' | '-' | '.'
1533             OpShift ~ '<<' | '>>'
1534             OpInequal ~ '<' | '>' | '<=' | '>=' | 'lt' | 'gt' | 'le' | 'ge'
1535             OpEqual ~ '==' | '!=' | '<=>' | 'eq' | 'ne' | 'cmp'
1536             OpBinAnd ~ '&'
1537             OpBinOr ~ '|' | '^'
1538             OpLogAnd ~ '&&'
1539             OpLogOr ~ '||' | '//'
1540             OpRange ~ '..' | '...'
1541             OpTriThen ~ '?'
1542             OpTriElse ~ ':'
1543             OpAssign ~ '=' | '*=' | '/=' | '%=' | 'x=' | '+=' | '-=' | '.=' | '<<=' | '>>=' | '&=' | '|=' | '^=' | '&&=' | '||=' | '//='
1544             OpComma ~ ',' | '=>'
1545             OpNameNot ~ 'not'
1546             OpNameAnd ~ 'and'
1547             OpNameOr ~ 'or' | 'xor'
1548              
1549             OpKeywordAbs ~ 'abs'
1550             OpKeywordAccept ~ 'accept'
1551             OpKeywordAlarm ~ 'alarm'
1552             OpKeywordAtan2 ~ 'atan2'
1553             OpKeywordBind ~ 'bind'
1554             OpKeywordBinmode ~ 'binmode'
1555             OpKeywordBless ~ 'bless'
1556             OpKeywordBreak ~ 'break'
1557             OpKeywordCaller ~ 'caller'
1558             OpKeywordChdir ~ 'chdir'
1559             OpKeywordChmod ~ 'chmod'
1560             OpKeywordChomp ~ 'chomp'
1561             OpKeywordChop ~ 'chop'
1562             OpKeywordChown ~ 'chown'
1563             OpKeywordChr ~ 'chr'
1564             OpKeywordChroot ~ 'chroot'
1565             OpKeywordClose ~ 'close'
1566             OpKeywordClosedir ~ 'closedir'
1567             OpKeywordConnect ~ 'connect'
1568             OpKeywordContinue ~ 'continue'
1569             OpKeywordCos ~ 'cos'
1570             OpKeywordCrypt ~ 'crypt'
1571             OpKeywordDbmclose ~ 'dbmclose'
1572             OpKeywordDbmopen ~ 'dbmopen'
1573             OpKeywordDefined ~ 'defined'
1574             OpKeywordDelete ~ 'delete'
1575             OpKeywordDie ~ 'die'
1576             OpKeywordDo ~ 'do'
1577             OpKeywordDump ~ 'dump'
1578             OpKeywordEach ~ 'each'
1579             OpKeywordEof ~ 'eof'
1580             OpKeywordEval ~ 'eval'
1581             OpKeywordEvalbytes ~ 'evalbytes'
1582             OpKeywordExec ~ 'exec'
1583             OpKeywordExists ~ 'exists'
1584             OpKeywordExit ~ 'exit'
1585             OpKeywordExp ~ 'exp'
1586             OpKeywordFc ~ 'fc'
1587             OpKeywordFor ~ 'for'
1588             OpKeywordForeach ~ 'foreach'
1589             OpKeywordFcntl ~ 'fcntl'
1590             OpKeywordFileno ~ 'fileno'
1591             OpKeywordFlock ~ 'flock'
1592             OpKeywordFork ~ 'fork'
1593             OpKeywordGetc ~ 'getc'
1594             OpKeywordGetlogin ~ 'getlogin'
1595             OpKeywordGetpeername ~ 'getpeername'
1596             OpKeywordGetpgrp ~ 'getpgrp'
1597             OpKeywordGetppid ~ 'getppid'
1598             OpKeywordGetpriority ~ 'getpriority'
1599             OpKeywordGetpwnam ~ 'getpwnam'
1600             OpKeywordGetgrnam ~ 'getgrnam'
1601             OpKeywordGethostbyname ~ 'gethostbyname'
1602             OpKeywordGetnetbyname ~ 'getnetbyname'
1603             OpKeywordGetprotobyname ~ 'getprotobyname'
1604             OpKeywordGetpwuid ~ 'getpwuid'
1605             OpKeywordGetgrgid ~ 'getgrgid'
1606             OpKeywordGetservbyname ~ 'getservbyname'
1607             OpKeywordGethostbyaddr ~ 'gethostbyaddr'
1608             OpKeywordGetnetbyaddr ~ 'getnetbyaddr'
1609             OpKeywordGetprotobynumber ~ 'getprotobynumber'
1610             OpKeywordGetservbyport ~ 'getservbyport'
1611             OpKeywordGetpwent ~ 'getpwent'
1612             OpKeywordGetgrent ~ 'getgrent'
1613             OpKeywordGethostent ~ 'gethostent'
1614             OpKeywordGetnetent ~ 'getnetent'
1615             OpKeywordGetprotoent ~ 'getprotoent'
1616             OpKeywordGetservent ~ 'getservent'
1617             OpKeywordSetpwent ~ 'setpwent'
1618             OpKeywordSetgrent ~ 'setgrent'
1619             OpKeywordSethostent ~ 'sethostent'
1620             OpKeywordSetnetent ~ 'setnetent'
1621             OpKeywordSetprotoent ~ 'setprotoent'
1622             OpKeywordSetservent ~ 'setservent'
1623             OpKeywordEndpwent ~ 'endpwent'
1624             OpKeywordEndgrent ~ 'endgrent'
1625             OpKeywordEndhostent ~ 'endhostent'
1626             OpKeywordEndnetent ~ 'endnetent'
1627             OpKeywordEndprotoent ~ 'endprotoent'
1628             OpKeywordEndservent ~ 'endservent'
1629             OpKeywordGetsockname ~ 'getsockname'
1630             OpKeywordGetsockopt ~ 'getsockopt'
1631             OpKeywordGlob ~ 'glob'
1632             OpKeywordGmtime ~ 'gmtime'
1633             OpKeywordGoto ~ 'goto'
1634             OpKeywordGrep ~ 'grep'
1635             OpKeywordHex ~ 'hex'
1636             OpKeywordIndex ~ 'index'
1637             OpKeywordInt ~ 'int'
1638             OpKeywordIoctl ~ 'ioctl'
1639             OpKeywordJoin ~ 'join'
1640             OpKeywordKeys ~ 'keys'
1641             OpKeywordKill ~ 'kill'
1642             OpKeywordLast ~ 'last'
1643             OpKeywordLc ~ 'lc'
1644             OpKeywordLcfirst ~ 'lcfirst'
1645             OpKeywordLength ~ 'length'
1646             OpKeywordLink ~ 'link'
1647             OpKeywordListen ~ 'listen'
1648             OpKeywordLocal ~ 'local'
1649             OpKeywordLocaltime ~ 'localtime'
1650             OpKeywordLock ~ 'lock'
1651             OpKeywordLog ~ 'log'
1652             OpKeywordLstat ~ 'lstat'
1653             OpKeywordM ~ 'm'
1654             OpKeywordMap ~ 'map'
1655             OpKeywordMkdir ~ 'mkdir'
1656             OpKeywordMsgctl ~ 'msgctl'
1657             OpKeywordMsgget ~ 'msgget'
1658             OpKeywordMsgrcv ~ 'msgrcv'
1659             OpKeywordMsgsnd ~ 'msgsnd'
1660             OpKeywordMy ~ 'my'
1661             OpKeywordNext ~ 'next'
1662             OpKeywordNo ~ 'no'
1663             OpKeywordOct ~ 'oct'
1664             OpKeywordOpen ~ 'open'
1665             OpKeywordOpendir ~ 'opendir'
1666             OpKeywordOrd ~ 'ord'
1667             OpKeywordOur ~ 'our'
1668             OpKeywordPack ~ 'pack'
1669             OpKeywordPackage ~ 'package'
1670             OpKeywordPipe ~ 'pipe'
1671             OpKeywordPop ~ 'pop'
1672             OpKeywordPos ~ 'pos'
1673             OpKeywordPrint ~ 'print'
1674             OpKeywordPrintf ~ 'printf'
1675             OpKeywordPrototype ~ 'prototype'
1676             OpKeywordPush ~ 'push'
1677             OpKeywordQ ~ 'q'
1678             OpKeywordQq ~ 'qq'
1679             OpKeywordQx ~ 'qx'
1680             OpKeywordQw ~ 'qw'
1681             OpKeywordQr ~ 'qr'
1682             OpKeywordQuotemeta ~ 'quotemeta'
1683             OpKeywordRand ~ 'rand'
1684             OpKeywordRead ~ 'read'
1685             OpKeywordReaddir ~ 'readdir'
1686             OpKeywordReadline ~ 'readline'
1687             OpKeywordReadlink ~ 'readlink'
1688             OpKeywordReadpipe ~ 'readpipe'
1689             OpKeywordRecv ~ 'recv'
1690             OpKeywordRedo ~ 'redo'
1691             OpKeywordRef ~ 'ref'
1692             OpKeywordRename ~ 'rename'
1693             OpKeywordRequire ~ 'require'
1694             OpKeywordReset ~ 'reset'
1695             OpKeywordReturn ~ 'return'
1696             OpKeywordReverse ~ 'reverse'
1697             OpKeywordRewinddir ~ 'rewinddir'
1698             OpKeywordRindex ~ 'rindex'
1699             OpKeywordRmdir ~ 'rmdir'
1700             OpKeywordS ~ 's'
1701             OpKeywordSay ~ 'say'
1702             OpKeywordScalar ~ 'scalar'
1703             OpKeywordSeek ~ 'seek'
1704             OpKeywordSeekdir ~ 'seekdir'
1705             OpKeywordSelect ~ 'select'
1706             OpKeywordSemctl ~ 'semctl'
1707             OpKeywordSemget ~ 'semget'
1708             OpKeywordSemop ~ 'semop'
1709             OpKeywordSend ~ 'send'
1710             OpKeywordSetpgrp ~ 'setpgrp'
1711             OpKeywordSetpriority ~ 'setpriority'
1712             OpKeywordSetsockopt ~ 'setsockopt'
1713             OpKeywordShift ~ 'shift'
1714             OpKeywordShmctl ~ 'shmctl'
1715             OpKeywordShmget ~ 'shmget'
1716             OpKeywordShmread ~ 'shmread'
1717             OpKeywordShmwrite ~ 'shmwrite'
1718             OpKeywordShutdown ~ 'shutdown'
1719             OpKeywordSin ~ 'sin'
1720             OpKeywordSleep ~ 'sleep'
1721             OpKeywordSocket ~ 'socket'
1722             OpKeywordSocketpair ~ 'socketpair'
1723             OpKeywordSort ~ 'sort'
1724             OpKeywordSplice ~ 'splice'
1725             OpKeywordSplit ~ 'split'
1726             OpKeywordSprintf ~ 'sprintf'
1727             OpKeywordSqrt ~ 'sqrt'
1728             OpKeywordSrand ~ 'srand'
1729             OpKeywordStat ~ 'stat'
1730             OpKeywordState ~ 'state'
1731             OpKeywordStudy ~ 'study'
1732             OpKeywordSub ~ 'sub'
1733             OpKeywordSubstr ~ 'substr'
1734             OpKeywordSymlink ~ 'symlink'
1735             OpKeywordSyscall ~ 'syscall'
1736             OpKeywordSysopen ~ 'sysopen'
1737             OpKeywordSysread ~ 'sysread'
1738             OpKeywordSysseek ~ 'sysseek'
1739             OpKeywordSystem ~ 'system'
1740             OpKeywordSyswrite ~ 'syswrite'
1741             OpKeywordTr ~ 'tr'
1742             OpKeywordTell ~ 'tell'
1743             OpKeywordTelldir ~ 'telldir'
1744             OpKeywordTie ~ 'tie'
1745             OpKeywordTied ~ 'tied'
1746             OpKeywordTime ~ 'time'
1747             OpKeywordTimes ~ 'times'
1748             OpKeywordTruncate ~ 'truncate'
1749             OpKeywordUc ~ 'uc'
1750             OpKeywordUcfirst ~ 'ucfirst'
1751             OpKeywordUmask ~ 'umask'
1752             OpKeywordUndef ~ 'undef'
1753             OpKeywordUnlink ~ 'unlink'
1754             OpKeywordUnpack ~ 'unpack'
1755             OpKeywordUnshift ~ 'unshift'
1756             OpKeywordUntie ~ 'untie'
1757             OpKeywordUse ~ 'use'
1758             OpKeywordUtime ~ 'utime'
1759             OpKeywordValues ~ 'values'
1760             OpKeywordVec ~ 'vec'
1761             OpKeywordWait ~ 'wait'
1762             OpKeywordWaitpid ~ 'waitpid'
1763             OpKeywordWantarray ~ 'wantarray'
1764             OpKeywordWarn ~ 'warn'
1765             OpKeywordWrite ~ 'write'
1766             OpKeywordY ~ 'y'
1767              
1768             OpFileReadableEffective ~ '-r'
1769             OpFileWritableEffective ~ '-w'
1770             OpFileRExecutableEffective ~ '-x'
1771             OpFileOwnedEffective ~ '-o'
1772             OpFileReadableReal ~ '-R'
1773             OpFileWritableReal ~ '-W'
1774             OpFileRExecutableReal ~ '-X'
1775             OpFileOwnedReal ~ '-O'
1776             OpFileExists ~ '-e'
1777             OpFileEmpty ~ '-z'
1778             OpFileNonEmpty ~ '-s'
1779             OpFilePlain ~ '-f'
1780             OpFileDirectory ~ '-d'
1781             OpFileSymbolic ~ '-l'
1782             OpFileNamedPipe ~ '-p'
1783             OpFileSocket ~ '-S'
1784             OpFileBlock ~ '-b'
1785             OpFileCharacter ~ '-c'
1786             OpFileOpenedTty ~ '-t'
1787             OpFileSetuid ~ '-u'
1788             OpFileSetgid ~ '-g'
1789             OpFileSticky ~ '-k'
1790             OpFileAsciiUtf8 ~ '-T'
1791             OpFileBinary ~ '-B'
1792             OpFileStartTime ~ '-M'
1793             OpFileAccessTime ~ '-A'
1794             OpFileChangeTime ~ '-C'
1795              
1796             ConditionIf ~ 'if'
1797             ConditionElsif ~ 'elsif'
1798             ConditionElse ~ 'else'
1799             ConditionUnless ~ 'unless'
1800             ConditionWhile ~ 'while'
1801             ConditionUntil ~ 'until'
1802             ConditionFor ~ 'for'
1803             ConditionForeach ~ 'foreach'
1804              
1805             BuiltinFilehandle ~ 'STDIN' | 'STDOUT' | 'STDERR' | 'ARGV' | 'ARGVOUT' | 'DATA'
1806              
1807             # Ignore whitespace
1808             :discard ~ whitespace
1809             whitespace ~ [\s]+
1810              
1811             # Comments
1812             :discard ~
1813             ~ |
1814             ~ '#'
1815             ~ '#'
1816             ~ *
1817             ~ [\x{A}\x{B}\x{C}\x{D}\x{2028}\x{2029}]
1818             ~ [^\x{A}\x{B}\x{C}\x{D}\x{2028}\x{2029}]
1819              
1820             # Recognize phases before subroutines
1821             :lexeme ~ PhaseName priority => 1
1822              
1823             # Recognize q* / s / m / y / tr before subroutines
1824             :lexeme ~ QLikeValueExpr priority => 1
1825             :lexeme ~ QLikeValueExprWithMods priority => 1
1826              
1827             :lexeme ~ VersionNumber priority => 1
1828              
1829             # Prioritize keywords over functions
1830             :lexeme ~ OpKeywordAbs priority => 1
1831             :lexeme ~ OpKeywordAccept priority => 1
1832             :lexeme ~ OpKeywordAlarm priority => 1
1833             :lexeme ~ OpKeywordAtan2 priority => 1
1834             :lexeme ~ OpKeywordBind priority => 1
1835             :lexeme ~ OpKeywordBinmode priority => 1
1836             :lexeme ~ OpKeywordBless priority => 1
1837             :lexeme ~ OpKeywordBreak priority => 1
1838             :lexeme ~ OpKeywordCaller priority => 1
1839             :lexeme ~ OpKeywordChdir priority => 1
1840             :lexeme ~ OpKeywordChmod priority => 1
1841             :lexeme ~ OpKeywordChomp priority => 1
1842             :lexeme ~ OpKeywordChop priority => 1
1843             :lexeme ~ OpKeywordChown priority => 1
1844             :lexeme ~ OpKeywordChr priority => 1
1845             :lexeme ~ OpKeywordChroot priority => 1
1846             :lexeme ~ OpKeywordClose priority => 1
1847             :lexeme ~ OpKeywordClosedir priority => 1
1848             :lexeme ~ OpKeywordConnect priority => 1
1849             :lexeme ~ OpKeywordContinue priority => 1
1850             :lexeme ~ OpKeywordCos priority => 1
1851             :lexeme ~ OpKeywordCrypt priority => 1
1852             :lexeme ~ OpKeywordDbmclose priority => 1
1853             :lexeme ~ OpKeywordDbmopen priority => 1
1854             :lexeme ~ OpKeywordDefined priority => 1
1855             :lexeme ~ OpKeywordDelete priority => 1
1856             :lexeme ~ OpKeywordDie priority => 1
1857             :lexeme ~ OpKeywordDo priority => 1
1858             :lexeme ~ OpKeywordDump priority => 1
1859             :lexeme ~ OpKeywordEach priority => 1
1860             :lexeme ~ OpKeywordEof priority => 1
1861             :lexeme ~ OpKeywordEval priority => 1
1862             :lexeme ~ OpKeywordEvalbytes priority => 1
1863             :lexeme ~ OpKeywordExec priority => 1
1864             :lexeme ~ OpKeywordExists priority => 1
1865             :lexeme ~ OpKeywordExit priority => 1
1866             :lexeme ~ OpKeywordExp priority => 1
1867             :lexeme ~ OpKeywordFc priority => 1
1868             :lexeme ~ OpKeywordFor priority => 1
1869             :lexeme ~ OpKeywordForeach priority => 1
1870             :lexeme ~ OpKeywordFcntl priority => 1
1871             :lexeme ~ OpKeywordFileno priority => 1
1872             :lexeme ~ OpKeywordFlock priority => 1
1873             :lexeme ~ OpKeywordFork priority => 1
1874             :lexeme ~ OpKeywordGetc priority => 1
1875             :lexeme ~ OpKeywordGetlogin priority => 1
1876             :lexeme ~ OpKeywordGetpeername priority => 1
1877             :lexeme ~ OpKeywordGetpgrp priority => 1
1878             :lexeme ~ OpKeywordGetppid priority => 1
1879             :lexeme ~ OpKeywordGetpriority priority => 1
1880             :lexeme ~ OpKeywordGetpwnam priority => 1
1881             :lexeme ~ OpKeywordGetgrnam priority => 1
1882             :lexeme ~ OpKeywordGethostbyname priority => 1
1883             :lexeme ~ OpKeywordGetnetbyname priority => 1
1884             :lexeme ~ OpKeywordGetprotobyname priority => 1
1885             :lexeme ~ OpKeywordGetpwuid priority => 1
1886             :lexeme ~ OpKeywordGetgrgid priority => 1
1887             :lexeme ~ OpKeywordGetservbyname priority => 1
1888             :lexeme ~ OpKeywordGethostbyaddr priority => 1
1889             :lexeme ~ OpKeywordGetnetbyaddr priority => 1
1890             :lexeme ~ OpKeywordGetprotobynumber priority => 1
1891             :lexeme ~ OpKeywordGetservbyport priority => 1
1892             :lexeme ~ OpKeywordGetpwent priority => 1
1893             :lexeme ~ OpKeywordGetgrent priority => 1
1894             :lexeme ~ OpKeywordGethostent priority => 1
1895             :lexeme ~ OpKeywordGetnetent priority => 1
1896             :lexeme ~ OpKeywordGetprotoent priority => 1
1897             :lexeme ~ OpKeywordGetservent priority => 1
1898             :lexeme ~ OpKeywordSetpwent priority => 1
1899             :lexeme ~ OpKeywordSetgrent priority => 1
1900             :lexeme ~ OpKeywordSethostent priority => 1
1901             :lexeme ~ OpKeywordSetnetent priority => 1
1902             :lexeme ~ OpKeywordSetprotoent priority => 1
1903             :lexeme ~ OpKeywordSetservent priority => 1
1904             :lexeme ~ OpKeywordEndpwent priority => 1
1905             :lexeme ~ OpKeywordEndgrent priority => 1
1906             :lexeme ~ OpKeywordEndhostent priority => 1
1907             :lexeme ~ OpKeywordEndnetent priority => 1
1908             :lexeme ~ OpKeywordEndprotoent priority => 1
1909             :lexeme ~ OpKeywordEndservent priority => 1
1910             :lexeme ~ OpKeywordGetsockname priority => 1
1911             :lexeme ~ OpKeywordGetsockopt priority => 1
1912             :lexeme ~ OpKeywordGlob priority => 1
1913             :lexeme ~ OpKeywordGmtime priority => 1
1914             :lexeme ~ OpKeywordGoto priority => 1
1915             :lexeme ~ OpKeywordGrep priority => 1
1916             :lexeme ~ OpKeywordHex priority => 1
1917             :lexeme ~ OpKeywordIndex priority => 1
1918             :lexeme ~ OpKeywordInt priority => 1
1919             :lexeme ~ OpKeywordIoctl priority => 1
1920             :lexeme ~ OpKeywordJoin priority => 1
1921             :lexeme ~ OpKeywordKeys priority => 1
1922             :lexeme ~ OpKeywordKill priority => 1
1923             :lexeme ~ OpKeywordLast priority => 1
1924             :lexeme ~ OpKeywordLc priority => 1
1925             :lexeme ~ OpKeywordLcfirst priority => 1
1926             :lexeme ~ OpKeywordLength priority => 1
1927             :lexeme ~ OpKeywordLink priority => 1
1928             :lexeme ~ OpKeywordListen priority => 1
1929             :lexeme ~ OpKeywordLocal priority => 1
1930             :lexeme ~ OpKeywordLocaltime priority => 1
1931             :lexeme ~ OpKeywordLock priority => 1
1932             :lexeme ~ OpKeywordLog priority => 1
1933             :lexeme ~ OpKeywordLstat priority => 1
1934             :lexeme ~ OpKeywordMap priority => 1
1935             :lexeme ~ OpKeywordMkdir priority => 1
1936             :lexeme ~ OpKeywordMsgctl priority => 1
1937             :lexeme ~ OpKeywordMsgget priority => 1
1938             :lexeme ~ OpKeywordMsgrcv priority => 1
1939             :lexeme ~ OpKeywordMsgsnd priority => 1
1940             :lexeme ~ OpKeywordMy priority => 1
1941             :lexeme ~ OpKeywordNext priority => 1
1942             :lexeme ~ OpKeywordNo priority => 1
1943             :lexeme ~ OpKeywordOct priority => 1
1944             :lexeme ~ OpKeywordOpen priority => 1
1945             :lexeme ~ OpKeywordOpendir priority => 1
1946             :lexeme ~ OpKeywordOrd priority => 1
1947             :lexeme ~ OpKeywordOur priority => 1
1948             :lexeme ~ OpKeywordPack priority => 1
1949             :lexeme ~ OpKeywordPackage priority => 1
1950             :lexeme ~ OpKeywordPipe priority => 1
1951             :lexeme ~ OpKeywordPop priority => 1
1952             :lexeme ~ OpKeywordPos priority => 1
1953             :lexeme ~ OpKeywordPrint priority => 1
1954             :lexeme ~ OpKeywordPrintf priority => 1
1955             :lexeme ~ OpKeywordPrototype priority => 1
1956             :lexeme ~ OpKeywordPush priority => 1
1957             :lexeme ~ OpKeywordQuotemeta priority => 1
1958             :lexeme ~ OpKeywordRand priority => 1
1959             :lexeme ~ OpKeywordRead priority => 1
1960             :lexeme ~ OpKeywordReaddir priority => 1
1961             :lexeme ~ OpKeywordReadline priority => 1
1962             :lexeme ~ OpKeywordReadlink priority => 1
1963             :lexeme ~ OpKeywordReadpipe priority => 1
1964             :lexeme ~ OpKeywordRecv priority => 1
1965             :lexeme ~ OpKeywordRedo priority => 1
1966             :lexeme ~ OpKeywordRef priority => 1
1967             :lexeme ~ OpKeywordRename priority => 1
1968             :lexeme ~ OpKeywordRequire priority => 1
1969             :lexeme ~ OpKeywordReset priority => 1
1970             :lexeme ~ OpKeywordReturn priority => 1
1971             :lexeme ~ OpKeywordReverse priority => 1
1972             :lexeme ~ OpKeywordRewinddir priority => 1
1973             :lexeme ~ OpKeywordRindex priority => 1
1974             :lexeme ~ OpKeywordRmdir priority => 1
1975             :lexeme ~ OpKeywordSay priority => 1
1976             :lexeme ~ OpKeywordScalar priority => 1
1977             :lexeme ~ OpKeywordSeek priority => 1
1978             :lexeme ~ OpKeywordSeekdir priority => 1
1979             :lexeme ~ OpKeywordSelect priority => 1
1980             :lexeme ~ OpKeywordSemctl priority => 1
1981             :lexeme ~ OpKeywordSemget priority => 1
1982             :lexeme ~ OpKeywordSemop priority => 1
1983             :lexeme ~ OpKeywordSend priority => 1
1984             :lexeme ~ OpKeywordSetpgrp priority => 1
1985             :lexeme ~ OpKeywordSetpriority priority => 1
1986             :lexeme ~ OpKeywordSetsockopt priority => 1
1987             :lexeme ~ OpKeywordShift priority => 1
1988             :lexeme ~ OpKeywordShmctl priority => 1
1989             :lexeme ~ OpKeywordShmget priority => 1
1990             :lexeme ~ OpKeywordShmread priority => 1
1991             :lexeme ~ OpKeywordShmwrite priority => 1
1992             :lexeme ~ OpKeywordShutdown priority => 1
1993             :lexeme ~ OpKeywordSin priority => 1
1994             :lexeme ~ OpKeywordSleep priority => 1
1995             :lexeme ~ OpKeywordSocket priority => 1
1996             :lexeme ~ OpKeywordSocketpair priority => 1
1997             :lexeme ~ OpKeywordSort priority => 1
1998             :lexeme ~ OpKeywordSplice priority => 1
1999             :lexeme ~ OpKeywordSplit priority => 1
2000             :lexeme ~ OpKeywordSprintf priority => 1
2001             :lexeme ~ OpKeywordSqrt priority => 1
2002             :lexeme ~ OpKeywordSrand priority => 1
2003             :lexeme ~ OpKeywordStat priority => 1
2004             :lexeme ~ OpKeywordState priority => 1
2005             :lexeme ~ OpKeywordStudy priority => 1
2006             :lexeme ~ OpKeywordSub priority => 1
2007             :lexeme ~ OpKeywordSubstr priority => 1
2008             :lexeme ~ OpKeywordSymlink priority => 1
2009             :lexeme ~ OpKeywordSyscall priority => 1
2010             :lexeme ~ OpKeywordSysopen priority => 1
2011             :lexeme ~ OpKeywordSysread priority => 1
2012             :lexeme ~ OpKeywordSysseek priority => 1
2013             :lexeme ~ OpKeywordSystem priority => 1
2014             :lexeme ~ OpKeywordSyswrite priority => 1
2015             :lexeme ~ OpKeywordTell priority => 1
2016             :lexeme ~ OpKeywordTelldir priority => 1
2017             :lexeme ~ OpKeywordTie priority => 1
2018             :lexeme ~ OpKeywordTied priority => 1
2019             :lexeme ~ OpKeywordTime priority => 1
2020             :lexeme ~ OpKeywordTimes priority => 1
2021             :lexeme ~ OpKeywordTruncate priority => 1
2022             :lexeme ~ OpKeywordUc priority => 1
2023             :lexeme ~ OpKeywordUcfirst priority => 1
2024             :lexeme ~ OpKeywordUmask priority => 1
2025             :lexeme ~ OpKeywordUndef priority => 1
2026             :lexeme ~ OpKeywordUnlink priority => 1
2027             :lexeme ~ OpKeywordUnpack priority => 1
2028             :lexeme ~ OpKeywordUnshift priority => 1
2029             :lexeme ~ OpKeywordUntie priority => 1
2030             :lexeme ~ OpKeywordUse priority => 1
2031             :lexeme ~ OpKeywordUtime priority => 1
2032             :lexeme ~ OpKeywordValues priority => 1
2033             :lexeme ~ OpKeywordVec priority => 1
2034             :lexeme ~ OpKeywordWait priority => 1
2035             :lexeme ~ OpKeywordWaitpid priority => 1
2036             :lexeme ~ OpKeywordWantarray priority => 1
2037             :lexeme ~ OpKeywordWarn priority => 1
2038             :lexeme ~ OpKeywordWrite priority => 1
2039              
2040             # This is the only Op that conflicts
2041             # OpInc conflicts with OpUnary
2042             # So when it's both, OpInc wins
2043             # (such as: sort $x + $y
2044             :lexeme ~ OpAdd priority => 1
2045              
2046             };
2047              
2048             our $grammar = Marpa::R2::Scanless::G->new({ source => \$grammar_source });
2049              
2050             sub build_struct {
2051 765     765 0 3635 my ( $rec, $initial_valueref ) = @_;
2052 765         2857 my @values = ($initial_valueref);
2053              
2054 765         3960 while ( my $valueref = shift @values ) {
2055 14335 100       18251 if ( ! ref ${$valueref} ) {
  14335         26698  
2056 3596         5668 ${$valueref} = {
2057             'name' => '',
2058             'type' => 'lexeme',
2059 3596         5762 'value' => ${$valueref},
  3596         11178  
2060             };
2061              
2062 3596         8670 next;
2063             }
2064              
2065 10739         13529 my $name = shift @{ ${$valueref} };
  10739         12354  
  10739         20627  
2066 10739         13342 my $start_pos = shift @{ ${$valueref} };
  10739         12713  
  10739         15117  
2067 10739         13207 my $length = shift @{ ${$valueref} };
  10739         12591  
  10739         14989  
2068 10739         13261 my @children = @{ ${$valueref} };
  10739         12694  
  10739         19729  
2069              
2070 10739         25256 my ( $line, $column ) = $rec->line_column($start_pos);
2071 10739         118563 ${$valueref} = {
  10739         17365  
2072             'name' => $name,
2073             'type' => 'rule',
2074             'start_pos' => $start_pos,
2075             'length' => $length,
2076             'children' => \@children,
2077             'line' => $line,
2078             'column' => $column,
2079             };
2080              
2081 10739         14299 push @values, map \$_, @{ ${$valueref}->{'children'} }
  10739         12189  
  10739         37773  
2082             }
2083             }
2084              
2085             sub parse {
2086 890     890 0 2997 my ($class, $text) = @_;
2087              
2088 890         3573 my %args = (
2089             'grammar' => $grammar,
2090              
2091             DEBUG()
2092             ? (
2093             'trace_terminals' => 1,
2094             'trace_values' => 1,
2095             )
2096             : (),
2097             );
2098              
2099 890         5863 my $rec = Marpa::R2::Scanless::R->new( \%args );
2100              
2101 890         496757 my @values;
2102             eval {
2103 890         4876 my $res = $rec->read( \$text );
2104 769         1338247 while ( my $value = $rec->value() ) {
2105 765         241995265 build_struct( $rec, $value );
2106 765         4510 push @values, $$value;
2107             }
2108 769         73058 1;
2109             }
2110 890 100       2139 or do {
2111 121         177993 my $err = $@;
2112 121 50       479 if (!@values) {
2113 121         458 for my $nterm (reverse qw/Program BlockStatement Statement NonBraceExprComma BlockLevelExpression Expression SubCall VarIdentExpr SubNameExpr/) {
2114 409         1749 my ($start, $length) = $rec->last_completed($nterm);
2115 409 100       1368795 next unless defined $start;
2116 109         578 my $range = $rec->substring($start, $length);
2117 109         5659 my $expect = $rec->terminals_expected();
2118 109         26195 my $progress = $rec->show_progress();
2119 109         1384990 die "$err\nFailed to parse past: $range (char $start, length $length), expected " . ( join ',', @{$expect} );# . "\n$progress";
  109         5123  
2120             }
2121 12         652 die "Failed to parse, dunno why.";
2122             }
2123             };
2124              
2125 769         625466 return @values;
2126             }
2127              
2128             1;
2129              
2130             __END__