Module: XRay::JS::Expr::Primary

Included in:
Expr
Defined in:
lib/js/expr/primary.rb

Constant Summary collapse

R_IDENTIFY =
/[a-zA-Z_$][\w$]*/
RESERVED_WORDS =
%w(
    break case catch continue debugger default delete do else 
    finally for function if in instanceof new return switch this
    throw try typeof var void while with
    class const enum export extends import super
    implements interface let package private protected public static yield
    null true false
)
R_THIS_NULL_BOOLEAN =
/(?:this|null|true|false)\b/
R_HEX =
/0[xX]/
R_NUMBERIC =
/[+-]?(?:\d|(?:[.]\d))/
R_STRING =
/['"]/
R_REGEXP =
/\/[^\/]/

Instance Method Summary collapse

Instance Method Details

#parse_expr_arrayObject



67
68
69
70
71
72
73
74
75
# File 'lib/js/expr/primary.rb', line 67

def parse_expr_array
  log 'parse expr array'

  pos = skip /\[/
  elms = batch(:parse_expr_assignment, /\]/, /,/)
  skip /\]/

  create_expression 'array', Elements.new(elms), pos 
end

#parse_expr_identifierObject



104
105
106
107
108
109
110
111
112
# File 'lib/js/expr/primary.rb', line 104

def parse_expr_identifier
  log 'parse expr identifier'

  id = scan(R_IDENTIFY)
  RESERVED_WORDS.include?(id.text) ? 
      parse_error("identifier can not be reserved word: #{id}") : id

  create_expression 'id', id
end

#parse_expr_literal_hexObject



136
137
138
139
140
# File 'lib/js/expr/primary.rb', line 136

def parse_expr_literal_hex
  log 'parse expr literal hex'
  expr = scan /0[xX][0-9a-fA-F]+/
  create_expression 'number', expr
end

#parse_expr_literal_numberObject



142
143
144
145
146
# File 'lib/js/expr/primary.rb', line 142

def parse_expr_literal_number
  log 'parse expr literal number'
  expr = scan /[+-]?(?:(?:\d*[.]\d+)|(?:\d+))(?:[eE][+-]?\d+)?/
  create_expression 'number', expr
end

#parse_expr_literal_regexpObject



148
149
150
151
152
# File 'lib/js/expr/primary.rb', line 148

def parse_expr_literal_regexp
  log 'parse expr literal regexp'
  expr = scan %r{/(?:(?:\\.)|(?:\[(?:\\.|[^\[\]])+\])|[^/\\])+/[a-z]*}
  create_expression 'regexp', expr
end

#parse_expr_literal_stringObject



122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/js/expr/primary.rb', line 122

def parse_expr_literal_string
  log 'parse expr literal string'

  expr = if check /'/
    scan /'(?:(?:\\')|(?:\\\n)|[^'\n])*'/
  elsif check /"/
    scan /"(?:(?:\\")|(?:\\\n)|[^"\n])*"/
  else
    raise 'assert false'
  end

  create_expression 'string', expr 
end

#parse_expr_literal_this_null_booleanObject



114
115
116
117
118
119
120
# File 'lib/js/expr/primary.rb', line 114

def parse_expr_literal_this_null_boolean
  log 'parse expr literal this null boolean'
  expr = scan /this|null|true|false/
  type = expr.text.gsub(/true|false/, 'boolean')

  create_expression type, expr 
end

#parse_expr_objectObject



77
78
79
80
81
82
83
84
85
# File 'lib/js/expr/primary.rb', line 77

def parse_expr_object
  log 'parse expr object'

  pos = skip /\{/
  elms = batch(:parse_expr_object_item, /\}/, /,/)
  skip /\}/

  create_expression 'object', Elements.new(elms), pos
end

#parse_expr_object_itemObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/js/expr/primary.rb', line 87

def parse_expr_object_item
  log 'parse expr object item'

  name = if check R_STRING
    parse_expr_literal_string
  elsif check R_NUMBERIC
    parse_expr_literal_number
  else
    parse_expr_identifier
  end

  skip /:/
  value = parse_expr_assignment
  
  Expression.new ':', name, value
end

#parse_expr_parenthesesObject



57
58
59
60
61
62
63
64
65
# File 'lib/js/expr/primary.rb', line 57

def parse_expr_parentheses
  log 'parse expr parentheses'

  pos = skip /\(/
  expr = parse_expression
  skip /\)/
  
  create_expression 'parentheses', expr, pos
end

#parse_expr_primaryObject



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/js/expr/primary.rb', line 24

def parse_expr_primary
  log "parse expr primary"
  if check /\(/
    parse_expr_parentheses

  elsif check /\[/
    parse_expr_array

  elsif check /\{/
    parse_expr_object

  # literal 
  elsif check R_THIS_NULL_BOOLEAN 
    parse_expr_literal_this_null_boolean

  elsif check R_HEX
    parse_expr_literal_hex

  elsif check R_NUMBERIC
    parse_expr_literal_number

  elsif check R_STRING
    parse_expr_literal_string

  elsif check R_REGEXP
    parse_expr_literal_regexp
  #~
  
  else
    parse_expr_identifier
  end
end