The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Language::Expr::Manual::Syntax - Description of the Language::Expr language

VERSION

version 0.15

OVERVIEW

Language::Expr language is very simple. It has just enough features to support mathematical/logical/string operations, arrays, hashes, variables, and function calls.

Language::Expr is (intentionally) not Turing-complete (lacks assignment and loops).

It should be trivial to implement an interpreter or code generator from the parser. In fact, Language::Expr is meant to be easily convertible to Perl, PHP, and Javascript (among others like Python and Ruby).

LITERALS

Undefined value

 undef

Boolean

 true
 false

Number

 1
 -2.3
 inf
 nan
 0x1f    # hexadecimal, = 31 in decimal
 0o17    # octal, = 15 in decimal
 0b100   # binary, = 4 in decimal

String

Single-quoted strings, e.g. 'single quoted'. Supported escape sequences:

 \'    literal single quote
 \\    literal backslash

Double-quoted strings, e.g. "double quoted". Supported escape sequences:

 \'    literal single quote
 \"    literal double quote
 \\    literal backslash
 \$    prevent variable interpolation
 \t    tab
 \n    newline
 \r    linefeed
 \f    formfeed
 \b    backspace
 \a    bell
 \e    escape

 \0 or \03 or \033    octal char
 \x7 or \x7B          hex char
 \x{263a}             wide hex char

Difference with Perl: Perl supports a few other escape sequences, but they are not commonly found in other scripting languages (e.g.: named Unicode character or the \l, \L, et al), so they are not included.

Double-quoted strings will also interpolate variables, e.g.:

 "I have $num apples"
 "This is Foo::Bar version ${perl:/Foo/Bar/VERSION}"

Array

 []
 [1, 2, "str"]

Difference from Perl: dangling comma at the end is not allowed.

Hash

 {}
 {a => 1, "b c" => 2+3}

Difference from Perl: you must always use "=>" to separate key and value, not comma. Dangling comma at the end is not allowed.

OPERATORS

Many operators are taken from Perl, along with their precedence levels and associativity, but here are the differences:

  • No assigment operators.

    Because assignment is not supported.

  • No smart-match "~~" operator or the other more esoteric or Perl-specific operators.

    These include Perl's "..", "...", "->", etc.

  • Currently no "and", "or", "not" operators.

    Use &&, ||, ! instead. Perl supports an extra, low-precedence set of logical operators mostly to separate statements, which we do not have.

  • "xor" becomes "^^" (to be consistent with "^" as bitwise-xor).

  • Currently no tertiary "?:" operator.

    Use if() function instead (availability depends on interpreter/compiler).

  • Hash value is accessed using [] instead of {}.

    Which, BTW, is also the way it is done in Python, Ruby, and PHP.

  • Comparison operators can be chained (except <=> and cmp).

Below is list of supported operators, ordered from lowest precedence, along with their associativity.

 left     =>
 left     || // ^^
 left     &&
 left     | ^
 left     &
 left     == != <=> cmp eq ne < > <= >= ge gt le lt
 nonassoc <=> cmp
 left     << >>
 left     + - .
 left     * / % x
 right    ! ~ unary+ unary-
 right    **
 left     hash[s], array[i]
 left     term (variable, str/num literals, (paren), func())

Pair

 left     =>

Logical or, defined-or, logical xor

 left     || // ^^

Logical and

 left     &&

Bitwise or, bitwise xor

 left     | ^

Bitwise and

 left     &

Comparison operators

 left     == != <=> cmp eq ne < > <= >= ge gt le lt

Tri-valued comparison

 nonassoc <=> cmp

Bitwise shift left & right

 left     << >>

Numeric addition, subtraction, string concatenation

 left     + - .

Numeric multiplication, division, modulus, string repetition

 left     * / % x

Logical not, bitwise not, unary plus, unary minus (numeric negation)

 right    ! ~ unary+ unary-

Numeric power

 right    **

Hash and array subscript

 left     hash[s], array[i]

Term

 left     term (variable, str/num literals, (paren), func())

VARIABLES

There are two syntax of variables:

 $alphanum123 (including $_)
 $.
 $..

and:

 ${anything goes except closing curly brace}

Difference from Perl: The simple syntax does not allow namespaces/package names (e.g. $foo::bar). In fact, the compiler/interpreter is allowed to have its own namespace scheme. Data::Schema and Data::Template::Expr uses a namespace + filesystem-like path scheme, e.g.:

 ${../foo}
 ${/foo/bar/baz}
 ${schema:/foo/bar/baz}
 ${data:../../baz}

FUNCTIONS

Examples:

 rand()
 length("foo")

Difference from Perl: parentheses are required.

The language define just a few functions:

map({ EXPR }, ARRAY) -> RESULT_ARRAY

This is similar to Perl's map() (but notice the required parentheses), it will form a new array composed from the result of EXPR. EXPR will be evaluated for each element of ARRAY (stored in $_). The original value of $_ will be restored after EXPR completes.

grep({ EXPR }, ARRAY) -> RESULT_ARRAY

This is similar to Perl's grep() (but notice the required parentheses), it will form a new array composed from the elements of ARRAY when EXPR evaluates to true (like in Perl, empty string '', the number 0, boolean false, undef are considered false). EXPR will be evaluated for each element of ARRAY (stored in $_). The original value of $_ will be restored after EXPR completes.

usort({ EXPR }, ARRAY) -> RESULT_ARRAY

This is similar to Perl's sort() (but notice the required parentheses), it will return the ARRAY sorted using comparison in EXPR. EXPR will be evaluated for each element of ARRAY ($a and $b will be set with two values to be compared). The original value of $a and $b will be restored after EXPR completes.

AUTHOR

Steven Haryanto <stevenharyanto@gmail.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Steven Haryanto.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.