Syntax Cheat Sheet

This document describes the syntax of mobl in a BNF-like notation.

Top-level

Start ::= "application" QId Def*
        | "module" QId Def*
        | "configuration" Config*

QId ::= ID
      | QId "::" ID

Configuration

Config ::= "title" STRING
         | "database" STRING
         | "icon" Path
         | "version" STRING
         | "stdlib" Path
         | "lib" Path 
         | "html" FILENAME
         | "output" STRING
         | "release" "output" STRING
         | "offline"
         | "debug"

Path := {FILENAME "/"}+
      | "/" {FILENAME "/"}+
      | STRING

Scripting

Functions

Def ::= "function" ID "(" {FArg ","}* ")" (":" Type)?
          "{" Stat* "}"

FArg ::= ID ":" Type ("=" Exp)?

Type ::= QId
       | QId "<" {QId ","}+ ">"

Statements

Stat ::= "var" ID ":" Type "=" Exp ";"
       | "var" ID "=" Exp ";"
       | LVal "=" Exp ";"
       | Exp ";"
       | "if" "(" Exp ")" Stat ("else" Stat)?
       | "foreach" "(" LVal ":" Type "in" Exp ")"
           "{" Stat* "}"
       | "foreach" "(" LVal "in" Exp ")" "{" Stat* "}"
       | "while" "(" Exp ")" "{" Stat* "}"
       | "{" Stat* "}" 
       | "return" Exp? ";"
       | "screen" "return" Exp? ";"
       | "return" ";"
       | "async" "{" Stat* "}"

LVal ::= QId 
       | Exp "." ID
       | "(" LVal "," {LVal ","}* ")"

Expressions

Exp ::= STRING
      | NUMBER
      | "true"
      | "false"
      | "null"
      | "this"
      | "event"
      | QId "(" {NamedExp ","}* ")"
      | "async" "(" Exp ("," Exp)? ")"
      | "!" Exp
      | QId
      | "(" Exp ")"
      | Exp "." ID "(" {NamedExp ","}* ")"
      | Exp "." ID 
      | Exp "[" Exp "]"
      | Exp Op Exp
      | Exp "?" Exp ":" Exp
      | QId "<" {Type ","}* ">" "(" {Exp ","}* ")"
      | "[" {Exp ","}* "]"
      | "(" Exp "," {Exp ","}* ")" 
      | "async" "(" {Exp ","}* ")"
      | "{" Stat* "}"
      | "function" "(" {FArg ","}* ")"
           (":" Type")? "{" Stat* "}"
      | "control" "(" {FArg ","}* ")"
          "{" ScreenElem* "}"
      | "$data" "(" Path ")"
      | Exp Filter+

QId ::= ID | QId "::" ID

Op ::= "||" | "&&" | "==" | "!=" | "<"  | "<=" | ">"
     | ">=" | "*"  | "/"  | "<<" | ">>" | "&"  | "|" 
     | "%"  | "+"  | "-"  | "++" | "--"


NamedExp ::= Exp
           | ID "=" Exp


Filter ::= "where" SetExp
         | "order" "by" OrderExp
         | "prefetch" {ID ","}+
         | "limit" Exp
         | "offset" Exp

OrderExp ::= ID 
           | ID "asc"
           | ID "desc"

SetExp ::= ID "==" Exp
         | ID "!=" Exp
         | ID "<"  Exp
         | ID "<=" Exp
         | ID ">"  Exp
         | ID ">=" Exp
         | ID "in" Exp
         | ID "not" "in" Exp
         | SetExp "&&" SetExp

UI

Def ::= "control" ID "(" {FArg ","}* ")" 
          "{" ScreenElem* "}"
      | "screen" ID "(" {FArg ","}* ")" ":" Type
          "{" ScreenElem* "}"

ScreenElem ::= "<" HTMLID HtmlArg* ">"
                 ScreenElem*
               "</" HTMLID ">"
             | Exp "(" {NamedExp ","}* ")"
                "{" ScreenElem* "}"
             | "var" ID (":" Type")? "=" Exp
             | "var" ID (":" Type")? "<-" Exp
             | "list" "(" LVal (":" Type)? "in" Exp ")"
                "{" ScreenElem* "}"
             | "when" "(" Exp ")" 
                "{" ScreenElem* "}"
               ("else" "{" ScreenElem* "}")?
             | "elements" "(" ")"
             | "script" "{" Stat* "}"

HtmlArg ::= ID "=" Exp
          | "databind" "=" Exp

NamedExp ::= Exp
           | ID "=" Exp

Styling

Def ::= "style" StyleSelector+ "{" StyleElem* "}"
      | "style" "$" ID "=" StyleExp
      | "style" "mixin" "$" ID "(" {StyleFArg ","}* ")" 
          "{" StyleElem* "}"

StyleFArg ::= "$" ID

StyleSelector ::= QId
                | QId ":" STYLEPROPID
                | QId ":" STYLEPROPID "(" STYLEPROPID ")"

StyleElem ::= STYLEPROPID ":" StyleExp ";"
            | "$" QId "(" {StyleExp ","}* ")" ";"

StyleExp ::= ANY_VALID_CSS_EXP
           | "$" ID
           | StyleExp "+" StyleExp
           | StyleExp "~" StyleExp
           | StyleExp "*" StyleExp
           | "$" ID "." ID
           | "$data" "(" Path ")"

Data Model

Def ::= "entity" ID "{" EBD* "}"
      | "type" ID "{" EBD* "}"

EBD ::= ID ":" Type ("(" {Anno ","}* ")")?
      | "static" "function" ID "(" {FArg ","}* ")"
           (":" Type")? "{" Stat* "}"
      | "function" ID "(" {FArg ","}* ")"
           (":" Type")? "{" Stat* "}"

Anno ::= "inverse:" ID
       | "searchable"

Services

Def ::= "service" ID "{" ServiceElem* "}"

ServiceElem ::= "root" "=" STRING
              | "resource" ID "(" {FArg ","}* ")" ":" Type
                  "{" RPropVal "}"

RPropVal ::= "method" "=" STRING
           | "data" "=" Exp
           | "encoding" "=" STRING
           | "mapper" "=" QId

Misc

Def ::= "load" Path
      | "load" STRING
      | "resource" Path
language/cheatsheet.txt · Last modified: 2011/06/27 09:00 by Zef Hemel