Skip to main content

Lexical Structure

This document describes the low-level lexical structure of Mux: tokens, keywords, identifiers, literals, and comments.

Source Files​

Mux source files use UTF-8 encoding. File extension is .mux.

Case Sensitivity​

Mux is case-sensitive. Keywords, identifiers, and type names must match the exact case as defined.

Mux
Loading...

Whitespace​

The only significant whitespace in Mux is the Newline character (\n), which separates statements. Other whitespace characters (space, tab, carriage return) are ignored except for separating tokens.

Mux
Loading...

Line continuation​

A newline inside an open ( or [ continues the expression instead of ending the statement, so a long call, a chain of operators, or a collection literal can be wrapped across lines.

Mux
Loading...

A trailing comma before the closing bracket is allowed, in a call as well as in a collection literal, so adding an entry stays a one-line change.

Braces are not continuation brackets. { opens both a block and a map or set literal, and those are not distinguishable at this level, so a newline inside { still separates statements - which is what makes an ordinary function body work:

Mux
Loading...

A map or set literal therefore spans lines only when it is itself inside parentheses or brackets.

Comments​

Single-Line Comments​

Single-line comments start with // and continue to the end of the line:

Mux
Loading...

Multi-Line Comments​

Multi-line comments start with /* and end with */. They can span multiple lines:

Mux
Loading...

Multi-line comments do not nest. The first */ terminates the comment.

Identifiers​

Identifiers name variables, functions, types, and other entities.

Rules​

  • Must start with a letter or an underscore
  • Can contain letters, digits, and underscores
  • An identifier that starts with an underscore needs at least one more character, because a lone _ is the placeholder
  • Cannot be a reserved keyword

As a pattern:

[a-zA-Z][a-zA-Z0-9_]*  |  _[a-zA-Z0-9_]+

Valid Identifiers​

Mux
Loading...

A leading underscore carries no meaning to the compiler. It is a convention, shared with Rust, Python, Go, C and JavaScript, for marking something deliberately unused or private to its module.

Note: Most Mux code uses snake_case, with some exceptions of course, but this is a convention, not a requirement.

Invalid Identifiers​

Mux
Loading...

Underscore Placeholder​

A lone _ is not an identifier at all. It is a placeholder, and it is the one spelling a name cannot take:

Mux
Loading...

The underscore has special semantics:

  • Cannot be read (assigning to _ discards the value)
  • Multiple uses of _ in the same scope do not conflict, including several in one signature: func f(int _, string _) is fine

None of this applies to a name that merely starts with an underscore. _x is an ordinary identifier: it binds, it can be read, and a second _x in the same scope is a duplicate like any other.

Mux
Loading...

Keywords​

The following words are reserved keywords and cannot be used as identifiers:

Declaration Keywords​

KeywordPurpose
funcFunction declaration
returnsReturn type specification for functions
constConstant declaration
autoType inference declaration
classClass declaration
interfaceInterface declaration
enumEnum declaration
commonStatic/class method
whereRuntime constraint clause on declarations

Control Flow Keywords​

KeywordPurpose
matchPattern matching expression
ifConditional expression
elseElse branch of conditional
forIteration loop
whileWhile loop
breakExit loop
continueSkip to next iteration
returnReturn from function

Module Keywords​

KeywordPurpose
importModule import
asImport alias

Operator Keywords​

KeywordPurpose
isType constraint / interface implementation
inMembership test
trueBoolean true literal
falseBoolean false literal
noneoptional none literal
someoptional some literal
okresult ok literal
errresult error literal

Special Keywords​

KeywordPurpose
selfInstance reference (inside class methods only)

Literals​

Integer Literals​

Decimal integers:

Mux
Loading...

Float Literals​

Mux
Loading...

Character Literals​

Single Unicode code point in single quotes:

Mux
Loading...

String Literals​

UTF-8 sequences in double quotes:

Mux
Loading...

Escape sequences:

  • \\ - Backslash
  • \" - Double quote
  • \' - Single quote
  • \n - Newline
  • \t - Tab
  • \r - Carriage return

Boolean Literals​

Mux
Loading...

none Literal​

Mux
Loading...

Operators and Punctuation​

Arithmetic Operators​

SymbolMeaning
+Addition
-Subtraction / Negation
*Multiplication
/Division
%Modulo
**Exponentiation

Comparison Operators​

SymbolMeaning
==Equality
!=Inequality
<Less than
<=Less than or equal
>Greater than
>=Greater than or equal

Logical Operators​

SymbolMeaning
&&Logical AND (short-circuit)
||Logical OR (short-circuit)
!Logical NOT

Other Operators​

SymbolMeaning
=Assignment
+=Compound assignment
-=Compound assignment
*=Compound assignment
/=Compound assignment
%=Compound assignment
++Postfix increment
--Postfix decrement
.Member access
&Reference creation
*Dereference

Punctuation​

SymbolUsage
( )tuple literals, Grouping, function calls, parameters
[ ]List literals, indexing
{ }Block statements, map literals, set literals
< >Type parameters (generics)
,Separator

Line Continuation​

Inside open parentheses or brackets, expressions can continue across lines, and a line may begin with a binary operator. Outside explicit grouping, continue a binary expression by placing its operator at the end of the previous line. An assignment operator must stay on the same line as its right-hand side.

Mux
Loading...

See Also​