%{ open Ast %} %token LPAREN %token RPAREN %token INTEGER %token IF %token DECISION %token STRING %token CASE %token ELSEIF %token UNDERSCORE %token ARM %token EQUALS %token AND %token OR %token VAR %type character %start character %% character: LPAREN rulelist RPAREN { List.rev $2 } ; rulelist: /*empty*/ { [] } | rulelist rule { $2 :: $1 } ; rule: LPAREN intlist stmt RPAREN { (List.rev $2, $3) } ; intlist: /*empty*/ { [] } | intlist INTEGER { $2 :: $1 } ; stmt: LPAREN IF condition stmt LPAREN iftail RPAREN { Eif($3, $4, $6) } | LPAREN DECISION newstate STRING RPAREN { Edecision {next = $3; utterance = $4} } | LPAREN CASE variable LPAREN armlist RPAREN stmt RPAREN { Ecase($3, List.rev $5, $7) } ; iftail: RPAREN stmt { $2 } | LPAREN ELSEIF condition stmt RPAREN iftail { Eif($3, $4, $6) } ; newstate: INTEGER { NSfixed $1 } | UNDERSCORE { NSdefault } ; armlist: /*empty*/ { [] } | armlist LPAREN ARM LPAREN intlist RPAREN stmt RPAREN { (List.rev $5, $7) :: $1 } ; condition: LPAREN EQUALS variable INTEGER RPAREN { Cequals($3, $4) } | LPAREN AND conditionlist RPAREN { Cand(List.rev $3) } | LPAREN OR conditionlist RPAREN { Cor(List.rev $3) } ; conditionlist: /*empty */ { [] } | conditionlist condition { $2 :: $1 } ; variable: LPAREN VAR STRING RPAREN { $3 } ; %%