Skip to content

Commit 4ac2328

Browse files
authored
Merge pull request #6 from tenable/object_namespace_switch
Support namespace, switch, and object
2 parents 3d51065 + f235c97 commit 4ac2328

File tree

14 files changed

+673
-19
lines changed

14 files changed

+673
-19
lines changed

lib/nasl/grammar.racc

Lines changed: 149 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
################################################################################
2-
# Copyright (c) 2011-2014, Tenable Network Security
2+
# Copyright (c) 2011-2018, Tenable Network Security
33
# All rights reserved.
44
#
55
# Redistribution and use in source and binary forms, with or without
@@ -74,18 +74,40 @@ rule
7474
{ c(*val) }
7575
| export
7676
{ val[0] }
77-
| COMMENT function
78-
{ c(*val) }
79-
| function
80-
{ val[0] }
77+
# | COMMENT function
78+
# { c(*val) }
79+
# | function
80+
# { val[0] }
8181
| statement
8282
{ val[0] }
83+
| obj_decl
84+
{ val[0] }
85+
| namespace
86+
{ val[0] }
8387
;
8488

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+
8599
statement : simple
86100
{ val[0] }
87101
| compound
88102
{ val[0] }
103+
| function
104+
{ val[0] }
105+
| COMMENT function
106+
{ c(*val) }
107+
| obj_decl
108+
{ val[0] }
109+
| namespace
110+
{ val[0] }
89111
;
90112

91113
##############################################################################
@@ -96,10 +118,16 @@ rule
96118
{ n(:Export, *val) }
97119
;
98120

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+
99127
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]) }
101129
| FUNCTION ident LPAREN RPAREN block
102-
{ n(:Function, *val) }
130+
{ n(:Function, val[0], 'normal', val[1], val[2], val[3], val[4]) }
103131
;
104132

105133
simple : assign
@@ -118,6 +146,8 @@ rule
118146
{ c(*val) }
119147
| global
120148
{ val[0] }
149+
| var_def
150+
{ val[0] }
121151
| import
122152
{ val[0] }
123153
| include
@@ -144,8 +174,23 @@ rule
144174
{ val[0] }
145175
| while
146176
{ val[0] }
177+
| switch
178+
{ val[0] }
179+
| case
180+
{ val[0] }
147181
;
148182

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+
;
149194
##############################################################################
150195
# Simple Statements
151196
##############################################################################
@@ -178,6 +223,10 @@ rule
178223
{ n(:Global, *val) }
179224
;
180225

226+
var_def : VAR var_decls SEMICOLON
227+
{ n(:Local, *val) }
228+
;
229+
181230
incr : incr_exp SEMICOLON
182231
{ val[0] }
183232
;
@@ -194,6 +243,10 @@ rule
194243
{ n(:Local, *val) }
195244
;
196245

246+
local : LOCAL var_decls SEMICOLON
247+
{ n(:Local, *val) }
248+
;
249+
197250
rep : call_exp REP expr SEMICOLON
198251
{ n(:Repetition, *val[0..-1]) }
199252
;
@@ -206,16 +259,53 @@ rule
206259
{ n(:Return, *val) }
207260
;
208261

262+
obj_func_attr : /* Empty */
263+
{ nil }
264+
| PUBLIC
265+
{ val[0] }
266+
| PRIVATE
267+
{ val[0] }
268+
;
269+
209270
##############################################################################
210271
# Compound Statements
211272
##############################################################################
212-
213273
block : LBRACE statements RBRACE
214274
{ n(:Block, *val) }
215275
| LBRACE RBRACE
216276
{ n(:Block, *val) }
217277
;
218278

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+
219309
for : FOR LPAREN field SEMICOLON expr SEMICOLON field RPAREN statement
220310
{ n(:For, *val) }
221311
;
@@ -364,13 +454,47 @@ rule
364454
{ val[0] }
365455
;
366456

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+
367491
##############################################################################
368492
# Named Components
369493
##############################################################################
370494

371-
arg : ident COLON expr
495+
arg : ident_ex COLON expr
372496
{ n(:Argument, *val) }
373-
| ident COLON ref
497+
| ident_ex COLON ref
374498
{ n(:Argument, *val) }
375499
| expr
376500
{ n(:Argument, *val) }
@@ -480,12 +604,22 @@ rule
480604
{ [val[0]] }
481605
;
482606

607+
obj_statements : obj_statement obj_statements
608+
{ [val[0]] + val[1] }
609+
| obj_statement
610+
{ [val[0]] }
611+
;
612+
483613
statements : statement statements
484614
{ [val[0]] + val[1] }
485615
| statement
486616
{ [val[0]] }
487617
;
488618

619+
obj_var : VAR var_decls
620+
{ n(:ObjVar, *val) }
621+
;
622+
489623
var_decl : ident ASS_EQ expr
490624
{ n(:Assignment, *val) }
491625
| ident ASS_EQ ref
@@ -546,6 +680,7 @@ require 'nasl/parser/argument'
546680
require 'nasl/parser/array'
547681
require 'nasl/parser/assigment'
548682
require 'nasl/parser/block'
683+
require 'nasl/parser/namespace'
549684
require 'nasl/parser/break'
550685
require 'nasl/parser/call'
551686
require 'nasl/parser/comment'
@@ -577,6 +712,10 @@ require 'nasl/parser/return'
577712
require 'nasl/parser/string'
578713
require 'nasl/parser/undefined'
579714
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'
580719

581720
---- inner ----
582721

lib/nasl/parser/block.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@ class Block < Node
3535
def initialize(tree, *tokens)
3636
super
3737

38-
@body = if @tokens.length == 3 then @tokens[1] else [] end
38+
if (@tokens.length == 4)
39+
@body = [@tokens[1]] + @tokens[2]
40+
elsif (@tokens.length == 3)
41+
@body = @tokens[1]
42+
else
43+
@body = []
44+
end
3945

4046
@children << :body
4147
end

lib/nasl/parser/case.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
################################################################################
2+
# Copyright (c) 2011-2018, Tenable Network Security
3+
# All rights reserved.
4+
#
5+
# Redistribution and use in source and binary forms, with or without
6+
# modification, are permitted provided that the following conditions are met:
7+
#
8+
# 1. Redistributions of source code must retain the above copyright notice, this
9+
# list of conditions and the following disclaimer.
10+
#
11+
# 2. Redistributions in binary form must reproduce the above copyright notice,
12+
# this list of conditions and the following disclaimer in the documentation
13+
# and/or other materials provided with the distribution.
14+
#
15+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
################################################################################
26+
27+
require 'nasl/parser/node'
28+
29+
module Nasl
30+
class Case < Node
31+
attr_reader :case_val, :case_op, :case_type
32+
33+
def initialize(tree, *tokens)
34+
super
35+
36+
if @tokens.length == 3
37+
@case_op = nil
38+
@case_val = @tokens[1]
39+
@case_type = 'normal'
40+
elsif @tokens.length == 6
41+
@case_op = @tokens[2]
42+
@case_val = @tokens[4]
43+
@case_type = 'normal_with_op'
44+
else
45+
@case_op = nil
46+
@case_val = nil
47+
@case_type = 'default'
48+
end
49+
50+
@children << :case_val
51+
@children << :case_op
52+
@children << :case_type
53+
end
54+
end
55+
end

lib/nasl/parser/function.rb

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,43 @@
2828

2929
module Nasl
3030
class Function < Node
31-
attr_reader :body, :name, :params
31+
attr_reader :body, :name, :params, :attribute, :fn_type
3232

3333
def initialize(tree, *tokens)
3434
super
3535

36-
@name = @tokens[1]
37-
@params = if @tokens.length == 6 then @tokens[3] else [] end
3836
@body = @tokens.last
3937

38+
@fn_type = @tokens[1]
39+
40+
if @fn_type == "obj"
41+
@name = @tokens[3]
42+
@attribute = @tokens[0]
43+
if @tokens.length == 8
44+
@params = @tokens[5]
45+
else
46+
@params = []
47+
end
48+
else
49+
@name = @tokens[2]
50+
@attribute = []
51+
if @tokens.length == 7
52+
@params = @tokens[4]
53+
else
54+
@params = []
55+
end
56+
end
57+
4058
@children << :name
59+
@children << :attribute
4160
@children << :params
4261
@children << :body
62+
@children << :fn_type
4363
end
64+
65+
def each
66+
@body.each{ |stmt| yield stmt }
67+
end
68+
4469
end
4570
end

0 commit comments

Comments
 (0)