\begin{syntax}
  expr ::= integer            ; integer constant
    | real                    ; real constant
    | "true" | "false"        ; Boolean constant
    | "()"                    ; empty tuple
    | qualid                  ; identifier in a scope
    | qualifier? "(" expr ")"        ; expression in a scope
    | qualifier? "begin" expr "end"  ; \textit{idem}
    | tight-op expr           ; tight operator
    | "{" (lqualid "=" expr ";")+ "}"     ; record
    | "{" expr "with" (lqualid "=" expr ";")+ "}"
                              ; record update
    | expr "." lqualid        ; record field access
    | expr "[" expr "]" "'"*  ; collection access
    | expr "[" expr "<-" expr "]" "'"*  ; collection update
    | expr "[" expr ".." expr "]" "'"*  ; collection slice
    | expr "[" expr ".." "]" "'"*  ; right-open slice
    | expr "[" ".." expr "]" "'"*  ; left-open slice
    | expr expr+              ; application
    | prefix-op expr          ; prefix operator
    | expr infix-op-4 expr    ; infix operator 4
    | expr infix-op-3 expr    ; infix operator 3
    | expr infix-op-2 expr    ; infix operator 2
    | expr infix-op-1 expr    ; infix operator 1
    | "not" expr              ; negation
    | expr "&&" expr          ; lazy conjunction
    | expr "||" expr          ; lazy disjunction
    | expr ":" type           ; type cast
    | attribute+ expr         ; attributes
    | "ghost" expr            ; ghost expression
    | expr ("," expr)+        ; tuple
    | expr "<-" expr          ; assignment
    | ...                     ; continued in Fig.~\ref{fig:bnf:expr2} %
\end{syntax}
