RULES = {
"." => { prefix: nil, infix: :access, level: :call },
- "[" => { prefix: nil, infix: :subscript, level: :call },
+ "[" => { prefix: :constant, infix: :subscript, level: :call },
"(" => { prefix: :grouping, infix: :func_call, level: :call },
"+" => { prefix: :unary, infix: :binary, level: :term },
"-" => { prefix: :unary, infix: :binary, level: :term },
"/" => { prefix: nil, infix: :binary, level: :factor },
"=" => { prefix: nil, infix: :assign, level: :assign },
:ident => { prefix: :variable, infix: nil, level: :none },
+ "{" => { prefix: :constant, infix: nil, level: :none },
:nil => { prefix: :constant, infix: nil, level: :none },
:bool => { prefix: :constant, infix: nil, level: :none },
:int => { prefix: :constant, infix: nil, level: :none },
if @prev.type == :byte
error("invalid byte value") if (val < 0 || val > 255)
end
- Ast::Val.new(Type::Int, nil)
+ Ast::Val.new(Type::Int, val.to_i)
elsif (@prev.type == :string)
Ast::Val.new("String", @prev.text)
elsif (@prev.type == :nil)
error("no float support yet")
elsif (@prev.type == :char)
error("no char support yet")
+ elsif (@prev.type == "[")
+ ary = []
+ while !matches("]")
+ ary << expression()
+ expect(",") if !matches("]")
+ end
+ expect("]")
+ ary
+ elsif (@prev.type == "{")
+ hsh = {}
+ while !matches("}")
+ name = expect(:ident).text
+ expect("=")
+ hsh[name] = expression()
+ expect(",") if !matches("}")
+ end
+ expect("}")
+ hsh
else
error("not a valid constant")
end