Module: Fdlint::Parser::JS::Expr::Primary

Included in:
Expr
Defined in:
lib/fdlint/parser/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



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

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



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

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



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

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



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

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



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

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

#parse_expr_literal_stringObject



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

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



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

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



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

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



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

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



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

def parse_expr_parentheses
  log 'parse expr parentheses'

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

#parse_expr_primaryObject



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
56
# File 'lib/fdlint/parser/js/expr/primary.rb', line 25

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