A Sally program consists of a series of function declarations. Each declaration consists of the name and type of a new function followed by a series of function applications and primitives. The domain types are listed before the function name, the range types, after. The syntax of each application is dictated by the types given in the function's definition. This application of foo would be appropriate anywhere a previous application requires an integer argument, or where a definition requires an integer result.
Functions can accept multiple arguments and return multiple results.
A function which returns multiple results can pass those results as a 'chunk' to the previous function application. The type void indicates lack of any arguments or results. When used to indicate the lack of results, it can be inferred by the fact that there are no types following the function name. See if you can find a way to change the parser so that void is always implicit, even when it's used to indicate the lack of arguments to a function. Be prepared to deal with a token which is an undeclared symbol in a mature way.