1
1
################################################################################
2
- # Copyright (c) 2011-2014 , Tenable Network Security
2
+ # Copyright (c) 2011-2018 , Tenable Network Security
3
3
# All rights reserved.
4
4
#
5
5
# Redistribution and use in source and binary forms, with or without
74
74
{ c(*val) }
75
75
| export
76
76
{ val[0] }
77
- | COMMENT function
78
- { c(*val) }
79
- | function
80
- { val[0] }
77
+ # | COMMENT function
78
+ # { c(*val) }
79
+ # | function
80
+ # { val[0] }
81
81
| statement
82
82
{ val[0] }
83
+ | obj_decl
84
+ { val[0] }
85
+ | namespace
86
+ { val[0] }
83
87
;
84
88
89
+ obj_statement : obj_var SEMICOLON
90
+ { val[0] }
91
+ | COMMENT obj_function
92
+ { c(*val) }
93
+ | obj_function
94
+ { val[0] }
95
+ ;
96
+ # | obj_function
97
+ # { val[0] }
98
+
85
99
statement : simple
86
100
{ val[0] }
87
101
| compound
88
102
{ val[0] }
103
+ | function
104
+ { val[0] }
105
+ | COMMENT function
106
+ { c(*val) }
107
+ | obj_decl
108
+ { val[0] }
109
+ | namespace
110
+ { val[0] }
89
111
;
90
112
91
113
##############################################################################
@@ -96,10 +118,16 @@ rule
96
118
{ n(:Export, *val) }
97
119
;
98
120
121
+ obj_function : obj_func_attr FUNCTION ident LPAREN params RPAREN block
122
+ { n(:Function, val[0], 'obj', val[1], val[2], val[3], val[4], val[5], val[6]) }
123
+ | obj_func_attr FUNCTION ident LPAREN RPAREN block
124
+ { n(:Function, val[0], 'obj', val[1], val[2], val[3], val[4], val[5]) }
125
+ ;
126
+
99
127
function : FUNCTION ident LPAREN params RPAREN block
100
- { n(:Function, * val) }
128
+ { n(:Function, val[0], 'normal', val[1], val[2], val[3], val[4], val[5] ) }
101
129
| FUNCTION ident LPAREN RPAREN block
102
- { n(:Function, * val) }
130
+ { n(:Function, val[0], 'normal', val[1], val[2], val[3], val[4] ) }
103
131
;
104
132
105
133
simple : assign
118
146
{ c(*val) }
119
147
| global
120
148
{ val[0] }
149
+ | var_def
150
+ { val[0] }
121
151
| import
122
152
{ val[0] }
123
153
| include
@@ -144,8 +174,23 @@ rule
144
174
{ val[0] }
145
175
| while
146
176
{ val[0] }
177
+ | switch
178
+ { val[0] }
179
+ | case
180
+ { val[0] }
147
181
;
148
182
183
+ namespace : NAMESPACE ident LBRACE statements RBRACE
184
+ { n(:Namespace, *val) }
185
+ | NAMESPACE ident LBRACE RBRACE
186
+ { n(:Namespace, *val) }
187
+ ;
188
+
189
+ obj_decl : OBJECT ident LBRACE obj_statements RBRACE
190
+ { n(:Object, *val) }
191
+ | NAMESPACE ident LBRACE RBRACE
192
+ { n(:Namespace, *val) }
193
+ ;
149
194
##############################################################################
150
195
# Simple Statements
151
196
##############################################################################
@@ -178,6 +223,10 @@ rule
178
223
{ n(:Global, *val) }
179
224
;
180
225
226
+ var_def : VAR var_decls SEMICOLON
227
+ { n(:Local, *val) }
228
+ ;
229
+
181
230
incr : incr_exp SEMICOLON
182
231
{ val[0] }
183
232
;
@@ -194,6 +243,10 @@ rule
194
243
{ n(:Local, *val) }
195
244
;
196
245
246
+ local : LOCAL var_decls SEMICOLON
247
+ { n(:Local, *val) }
248
+ ;
249
+
197
250
rep : call_exp REP expr SEMICOLON
198
251
{ n(:Repetition, *val[0..-1]) }
199
252
;
@@ -206,16 +259,53 @@ rule
206
259
{ n(:Return, *val) }
207
260
;
208
261
262
+ obj_func_attr : /* Empty */
263
+ { nil }
264
+ | PUBLIC
265
+ { val[0] }
266
+ | PRIVATE
267
+ { val[0] }
268
+ ;
269
+
209
270
##############################################################################
210
271
# Compound Statements
211
272
##############################################################################
212
-
213
273
block : LBRACE statements RBRACE
214
274
{ n(:Block, *val) }
215
275
| LBRACE RBRACE
216
276
{ n(:Block, *val) }
217
277
;
218
278
279
+ switch : SWITCH LPAREN expr RPAREN switch_block
280
+ { n(:Switch, *val) }
281
+ | SWITCH LBRACK switch_op RBRACK LPAREN expr RPAREN switch_block
282
+ { n(:Switch, *val) }
283
+ ;
284
+
285
+ case : CASE case_expr_list COLON
286
+ { n(:Case, *val) }
287
+ | CASE LBRACK switch_op RBRACK case_expr_list COLON
288
+ { n(:Case, *val) }
289
+ | DEFAULT COLON
290
+ { n(:Case, *val) }
291
+ ;
292
+
293
+ case_expr : expr
294
+ { val[0] }
295
+ ;
296
+
297
+ case_expr_list : case_expr
298
+ { val[0] }
299
+ | case_expr COMMA case_expr_list
300
+ { [val[0]] + val[2] }
301
+ ;
302
+
303
+ switch_block : LBRACE case statements RBRACE
304
+ { n(:Block, *val) }
305
+ | LBRACE RBRACE
306
+ { n(:Block, *val) }
307
+ ;
308
+
219
309
for : FOR LPAREN field SEMICOLON expr SEMICOLON field RPAREN statement
220
310
{ n(:For, *val) }
221
311
;
@@ -364,13 +454,47 @@ rule
364
454
{ val[0] }
365
455
;
366
456
457
+ switch_op : SUBSTR_EQ
458
+ { val[0] }
459
+ | SUBSTR_NE
460
+ { val[0] }
461
+ | REGEX_EQ
462
+ { val[0] }
463
+ | REGEX_NE
464
+ { val[0] }
465
+ | CMP_LT
466
+ { val[0] }
467
+ | CMP_GT
468
+ { val[0] }
469
+ | CMP_EQ
470
+ { val[0] }
471
+ | CMP_NE
472
+ { val[0] }
473
+ | CMP_LE
474
+ { val[0] }
475
+ | CMP_GE
476
+ { val[0] }
477
+ | AMPERSAND
478
+ { val[0] }
479
+ | BIT_XOR
480
+ { val[0] }
481
+ | BIT_OR
482
+ { val[0] }
483
+ ;
484
+
485
+
486
+ ident_ex : ident
487
+ { val[0] }
488
+ | VAR
489
+ { val[0] }
490
+
367
491
##############################################################################
368
492
# Named Components
369
493
##############################################################################
370
494
371
- arg : ident COLON expr
495
+ arg : ident_ex COLON expr
372
496
{ n(:Argument, *val) }
373
- | ident COLON ref
497
+ | ident_ex COLON ref
374
498
{ n(:Argument, *val) }
375
499
| expr
376
500
{ n(:Argument, *val) }
@@ -480,12 +604,22 @@ rule
480
604
{ [val[0]] }
481
605
;
482
606
607
+ obj_statements : obj_statement obj_statements
608
+ { [val[0]] + val[1] }
609
+ | obj_statement
610
+ { [val[0]] }
611
+ ;
612
+
483
613
statements : statement statements
484
614
{ [val[0]] + val[1] }
485
615
| statement
486
616
{ [val[0]] }
487
617
;
488
618
619
+ obj_var : VAR var_decls
620
+ { n(:ObjVar, *val) }
621
+ ;
622
+
489
623
var_decl : ident ASS_EQ expr
490
624
{ n(:Assignment, *val) }
491
625
| ident ASS_EQ ref
@@ -546,6 +680,7 @@ require 'nasl/parser/argument'
546
680
require 'nasl/parser/array'
547
681
require 'nasl/parser/assigment'
548
682
require 'nasl/parser/block'
683
+ require 'nasl/parser/namespace'
549
684
require 'nasl/parser/break'
550
685
require 'nasl/parser/call'
551
686
require 'nasl/parser/comment'
@@ -577,6 +712,10 @@ require 'nasl/parser/return'
577
712
require 'nasl/parser/string'
578
713
require 'nasl/parser/undefined'
579
714
require 'nasl/parser/while'
715
+ require 'nasl/parser/object'
716
+ require 'nasl/parser/switch'
717
+ require 'nasl/parser/case'
718
+ require 'nasl/parser/obj_var'
580
719
581
720
---- inner ----
582
721
0 commit comments