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.