7.3.Grammar summary

Informative EBNF. Whitespace between tokens is free; the semantic rules in §7.4–§7.8 are normative.

script      = [ item ] , { ( "|" | "||" ) , [ item ] } ;
item        = operand , [ ";" , operand ]                     (* 1.1.1 *)
            | pause | shift | reset | expr | "@none" | "@break" ;
operand     = gloss | group | spell | anchor | mirror | buoy | compound | viseme ;
gloss       = name , [ "(" , [ number ] , [ "," , label ] , ")" ] , [ "!" ] ;   (* "!" 1.1.1 *)
name        = word , [ "#" , word ] ;
group       = "[" , member , { "|" , member } , "]" ,
              [ "(" , [ number ] , [ "," , [ number ] , [ "," , label ] ] , ")" ] ;
member      = gloss | spell ;
run         = unit , { "|" , unit } ;
unit        = gloss | group ;
spell       = "$spell" , [ "(" , [ number ] , [ "," , [ number ] , [ "," , [ number ] ,
              [ "," , [ number ] , [ "," , label ] ] ] ] , ")" ] , "{" , run , "}" ;
num4        = [ number ] , [ "," , [ number ] , [ "," , [ number ] , [ "," , [ number ] ] ] ] ;
pause       = "$pause" , [ "(" , [ number ] , ")" ] ;
shift       = "$shift" , [ "(" , num4 , ")" ] ;
reset       = "$reset" ;
expr        = "@" , word , [ "(" , [ number ] , [ "," , [ number ] , [ "," , [ number ] ] ] , ")" ] ;
anchor      = "$anchor" , "(" , site , ")" , "{" , run , "}" ;                (* 1.1.1 *)
mirror      = "$mirror" , [ args ] , "{" , run , "}" ;                        (* 1.1.1 *)
buoy        = "$buoy" , [ args ] , "{" , run , "}" , "{" , run , "}" ;        (* 1.1.1 *)
compound    = "$compound" , [ args ] , "{" , cop , "}" , "{" , cop , "}" ;   (* 1.1.1 *)
cop         = operand , [ ";" , operand ] ;
viseme      = "$viseme" , "(" , text , [ "," , number ] , ")" ;               (* 1.1.1 *)
args        = "(" , [ number ] , [ "," , label ] , ")" ;
site        = "neck" | "forehead" | "mouth" | "navel" | "shoulder_l" | "shoulder_r" ;
usercall    = "%" , ident , "(" , { char - ( "(" | ")" ) } , ")" ;           (* 1.1.2, pre-pass *)
ident       = ( letter | "_" ) , { letter | digit | "_" } ;                   (* ASCII *)

usercall is not part of the token grammar: calls are expanded to text before tokenizing (§7.8), so after expansion a script contains no % call.