module Bindy

grammar Language

  rule expression
    function / value
  end

  rule function
    identifier:identifier space* '(' space* arg_list:arg_list space* ')' <Function>
  end

  rule arg_list
    expression space* ',' space* arg_list <ArgList> / 
    expression /
    space*
  end

  rule identifier
    [a-z0-9\_]+
  end

  rule value
    number / boolean / string / null
  end

  rule string
    "'" value:[\da-zA-ZáéíóúüñÁÉÍÓÚÜÑ¿?!¡\s\@\#\$\%\&\/\\\*\_\-\+\/\\\*\_\-\+\.\:\,\;\<\>\|\"\\(\)]* "'" <LiteralString>
  end

  rule number
    float / integer
  end

  rule integer
    [\+\-]? [\d]+ <LiteralInteger>
  end

  rule float
    [\+\-]? [\d]+ '.' [\d]+ <LiteralFloat>
  end

  rule boolean
    true / false
  end

  rule true
    'true' <LiteralTrue>
  end

  rule false
    'false' <LiteralFalse>
  end

  rule null
    'null' <LiteralNull>
  end

  rule space
    [\s\t\n]
  end

end

end