File Coverage

blib/lib/Guacamole.pm
Criterion Covered Total %
statement 70 85 82.3
branch 11 22 50.0
condition 0 9 0.0
subroutine 7 9 77.7
pod 0 4 0.0
total 88 129 68.2


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