MAXScript Grammar

The following is the complete MAXScript grammar in EBNF form. It differs slightly in factoring from the syntax forms given in the online reference, so that all precedence is explicit in the rules.

These rules, or syntax definitions, follow the standard EBNF notation (Extended Backus-Naur Form). The rules typically contain a number of characters with special meanings. For example, brackets enclose optional items, such as the minus sign in front of the number. Braces enclose items you can use repeatedly, and bars separate multiple items from which you can choose one. Sometimes, rules are given names so they can be referred to in the documentation or as parts of other rules. The special characters in the rules have the following meaning:

[...] -- items inside the brackets are optional

(...|...|...) -- choose one of the items separated by the bars

{...} -- you can specify the braced item ZERO or more times

{...}+ -- you can specify the braced item ONE or more times

::= -- define a name for a syntax rule

<rule> -- you can insert what is defined by the named rule

bold_characters -- characters or token as written

An example of an EBNF form is:

[-]{<digit>}[.{<digit>}][(e | E)[+ | -]{<digit>}+]

which is interpreted as follows:

Syntax

Definition

[-]{<digit>}

an optional minus sign (the sign), followed by
0 or more digits (the integer part), followed by

[.{<digit>}]

an optional sequence (the fraction part) comprised of:
a period character, followed by
0 or more digits, followed by

[(e | E)[+ | -]{<digit>}+]

an optional sequence (the exponent part) comprised of:
either an ‘e’ or ‘E’, followed by
an optional plus or minus sign, followed by
one or more digits.

 

<program> ::= { <expr> }+

<expr> ::= <simple_expr>

<variable_decls>

<assignment>

<if_expr>

<while_loop>

<do_loop>

<for_loop>

<loop_exit>

<case_expr>

<struct_def>

<try_expr>

<variable_decls>

<function_def>

<function_return>

<context_expr>

<max_command>

<utility_def>

<rollout_def>

<tool_def>

<rcmenu_def>

<macroscript_def>

<plugin_def>

<variable_decls> ::= ( local | global ) <decl> { , <decl> }

persistent global <decl> { , <decl> }

<decl> ::= <var_name> [ = <expr> ] -- name and optional

-- initial value

<var_name> ::= { <alphanumeric> | _ }

'{ <any_char_except_quote> }'

<assignment> ::= <destination> = <expr>

<destination> += <expr>

<destination> -= <expr>

<destination> *= <expr>

<destination> /= <expr>

<destination> ::= <var_name>

<property>

<index>

<if_expr> ::= if <expr> then <expr> [ else <expr> ]

if <expr> do <expr>

<while_loop> ::= while <expr> do <expr>

<do_loop> ::= do <expr> while <expr>

<for_loop> ::= for <name> ( in | = ) <source> (do | collect) <expr>

<source> ::= <expr> to <expr> [ by <expr> ] [ where <expr> ]

<expr> [ where <expr> ]

<loop-exit> ::= exit [ with <expr> ]

<loop-continue> ::= continue

<case_expr> ::= case [ <expr> ] of ( { <case_item> } )

<case_item> ::= <factor> : <expr>

default : <expr>

<struct_def> ::= struct (<member> { , <member> } )

<member> ::= <name> [ = <expr> ] -- name and optional initial value

<function_def>

<try_expr> ::= try <expr> catch <expr>

<function_def> ::= [ mapped ] (function | fn) <var_name> { <arg> } = <expr>

<arg> ::= <var_name>

<var_name>: [ <operand> ]

<function_return> ::= return <expr>

<context_expr> ::= <context> { , <context> } <expr>

<context> ::= [with] animate <logical_expr>

at level <operand>

at time <operand>

in <operand>

[in] coordsys ( local | world | parent | <operand> )

about ( pivot | selection | coordsys | <operand> )

[ with ] undo <logical_expr>

<set_context> ::= set <context>

<utility_def> ::= utility <var_name> <string> { <var_name>:<operand> } \

( { <utility_clause> }+ )

<utility_clause> ::= <rollout>

<rollout_clause>

<rollout_def> ::= rollout <var_name> <string> { <var_name>:<operand> } \

( { <rollout_clause> }+ )

<rollout_clause> ::= local <decl> { , <decl> }

<function_def>

<struct_def>

<mousetool>

<item_group>

<rollout_item>

<rollout_handler>

<item_group> ::= group <string> ( { <rollout_item> } )

<rollout_handler> ::= on <var_name> <var_name> { <var_name> } do <expr>

<rollout_item> ::= <item_type> <var_name> [ <string> ] { <var_name>:<operand> }

<item_type> ::= label

button

edittext

combobox

dropdownList

listbox

spinner

slider

pickbutton

radiobuttons

checkbox

checkbutton

colorPicker

mapbutton

materialbutton

progressbar

timer

bitmap

<rcmenu_def> ::= rcmenu <var_name> ( { <rcmenu_clause> }+ )

<rcmenu_clause> ::= local <decl> { , <decl> }

<function_def>

<struct_def>

<rcmenu_item>

<rcmenu_handler>

<rcmenu_handler> ::= on <var_name> <var_name> do <expr>

<rcmenu_item> ::= <rcmenu_item_type> <var_name> <string> { <var_name>:<operand> }

<rcmenu_item_type>::= menuitem

separator

submenu

<macroscript_def> ::= macroscript <var_name> <string> { <var_name>:<operand> } \

( <expr_seq> )

<mousetool_def> ::= tool <var_name> { <var_name>:<operand> } ( { <tool_clause> }+ )

<tool_clause> ::= local <decl> { , <decl> }

<function_def>

<struct_def>

<tool_handler>

<tool_handler> ::= on <var_name> <var_name> { <var_name> } do <expr>

<plugin_def> ::= plugin <var_name> <var_name> { <var_name>:<operand> } \

( { <plugin_clause> }+ )

<plugin_clause> ::= local <decl> { , <decl> }

<function_def>

<struct_def>

<parameters>

<mousetool_def>

<rollout_def>

<plugin_handler>

<parameters> ::= parameters <var_name> { <var_name>:<operand> } ( { <param_clause> }+ )

<param_clause> ::= { <param_defs> }+

{ <param_handler> }

<param_defs> ::= <var_name> { <var_name>:<operand> }

<param_handler> ::= on <var_name> <var_name> { <var_name> } do <expr>

<plugin_handler> ::= on <var_name> do <expr>

<simple_expr> ::= <operand>

<math_expr>

<compare_expr>

<logical_expr>

<function_call>

<expr_seq>

<math_expr> ::= <math_operand> + <math_operand> -- standard arithmetic addition

<math_operand> - <math_operand> -- standard arithmetic subtraction

<math_operand> * <math_operand> -- standard arithmetic multiplication

<math_operand> / <math_operand> -- standard arithmetic division

<math_operand> ^ <math_operand> -- exponential, raise to the power

<math_operand> as <class> -- conversion between types

<math_operand> ::= <operand>

<function_call>

<math_expr>

<logical_expr> ::= <logical_operand> or <logical_operand>

<logical_operand> and <logical_operand>

not <logical_operand>

<logical_operand> ::= <operand>

<compare_expr>

<function_call>

<logical_expr>

<compare_expr> ::= <compare_operand> == <compare_operand> -- equal

<compare_operand> != <compare_operand> -- not equal

<compare_operand> > <compare_operand> -- greater than

<compare_operand> < <compare_operand> -- less than

<compare_operand> >= <compare_operand> -- greater than or equal

<compare_operand> <= <compare_operand> -- less than or equal

<compare_operand> ::= <math_expr>

<operand>

<function_call>

<function_call> ::= <operand> ()

<operand> { <parameter> } -- up to an end of line or

-- lower precedence token

<parameter> ::= <operand>

<name>: <operand>

<operand> ::= <factor>

<property>

<index>

<property> ::= <operand> . <var_name> -- properties and indexes

-- left associate

<index> ::= <operand> [ <expr> ]

<factor> ::= <number>

<string>

<path_name>

<var_name>

#<var_name>

<array>

<bitarray>

<point3>

<point2>

true

false

on

off

ok

undefined

unsupplied

- <expr> -- unary minus

<expr_seq>

? -- last Listener result

<expr_seq> ::= ( <expr> { (; | <eol>) <expr> } )

<number> ::= [-]{<digit>}[.{<digit>}[(e | E)[+ | -]{<digit>}+] -- decimal number

0x{<hex_digit>}+ -- hexadecimal number

<string> ::= "{ <any_char_except_quote> | \" | \n | \r | \t | \* | \? | \\ | \% | \x{<hex_digit>}+ }"

<time> ::= [-]{<decimal_number>[m | s | f | t]}+ -- minutes/sec/frames/ticks

[-]{<digit>}:{<digit>}[.{<digit>}] -- SMPTE mins:secs.frame

[-]<decimal_number>n -- active segment normalized time

<box2> ::= [ <expr>, <expr>, <expr>, <expr> ]

<point3> ::= [ <expr>, <expr>, <expr> ]

<point2> ::= [ <expr>, <expr> ]

<array> ::= #()

#( <expr> { , <expr> } )

<bitarray> ::= #{}

#{ [<expr> | <expr>..<expr>] { , [<expr> | <expr>..<expr>] } }

<path_name> ::= $<path> | $

<path> ::= [ <objectset> ] [ / ] [ <levels> ] <level_name>

<levels> ::= <level> { / <level> }

<level> ::= <level_name>

...

<level_name> ::= { <alphanumeric> | _ | * | ? | \ }

'{ <any_char_except_single_quote> | \* | \? | \\ }'