[[literals]]
=== Literals

Literals are values that you can specify directly in Painless scripts.

[[integers]]
==== Integers

Specify integer literals in decimal, octal, or hex notation. Use the following
single letter designations to specify the primitive type: `l` for `long`, `f`
for `float`, and `d` for `double`.  If not specified, the type defaults to
`int` (with the exception of certain assignments described later).

*Grammar:*
[source,ANTLR4]
----
INTEGER: '-'? ( '0' | [1-9] [0-9]* ) [lLfFdD]?;
OCTAL: '-'? '0' [0-7]+ [lL]?;
HEX: '-'? '0' [xX] [0-9a-fA-F]+ [lL]?;
----

*Examples:*
[source,Java]
----
0     // integer literal of 0
0D    // double literal of 0.0
1234L // long literal of 1234
-90F  // float literal of -90.0
-022  // integer literal of -18 specified in octal
0xF2A // integer literal of 3882
----

[[floating-point-values]]
==== Floating Point Values

Specify floating point literals using the following single letter designations
for the primitive type: `f` for `float` and `d` for `double`.
If not specified, the type defaults to `double`.

*Grammar:*
[source,ANTLR4]
----
DECIMAL: '-'? ( '0' | [1-9] [0-9]* ) (DOT [0-9]+)? ( [eE] [+\-]? [0-9]+ )? [fFdD]?;
----

*Examples:*
[source,Java]
----
0.0      // double value of 0.0
1E6      // double value of 1000000
0.977777 // double value of 0.97777
-126.34  // double value of -126.34
89.9F    // float value of 89.9
----

[[strings]]
==== Strings

Specify literal string with either single or double quotes. In double-quoted
literal strings, you can escape double-quotes with a backslash to include them
in the string. Similarly, you escape single quotes with a backslash in
single-quoted literal strings. Backslashes themselves also need to be
escaped with a backslash.

*Grammar:*
[source,ANTLR4]
----
STRING: ( '"' ( '\\"' | '\\\\' | ~[\\"] )*? '"' ) | ( '\'' ( '\\\'' | '\\\\' | ~[\\'] )*? '\'' );
----

*Examples:*
[source,Java]
----
"double-quoted String literal"
'single-quoted String literal'
"\"double-quoted String with escaped double-quotes\" and backslash: \\"
'\'single-quoted String with escaped single-quotes\' and backslash \\'
"double-quoted String with non-escaped 'single-quotes'"
'single-quoted String with non-escaped "double-quotes"'
----

[[char]]
===== Char

You cannot directly specify character literals in Painless. However, you can
cast single-character strings to char. Attempting to cast a multi-character
string to a char throws an error.

*Examples:*
[source,Java]
----
(char)"C"
(char)'c'
----