Expression ::= Step {";" Step} | Step {"&" Step}. Step ::= Term {"|" Term}. Term ::= PrefixTerm [ {"&&" PrefixTerm} | {"||" PrefixTerm} | {">&" PrefixTerm} | {">|" PrefixTerm} | {">," PrefixTerm} | "having" PrefixTerm | "having-only" PrefixTerm | "..." PrefixTerm]. PrefixTerm ::= Primary | "first" PrefixTerm | "last" PrefixTerm | "prefix" PrefixTerm | "suffix" PrefixTerm | "start-of" PrefixTerm | "end-of" PrefixTerm | "prepend" PrefixTerm | "append" PrefixTerm | "substitute" PrefixTerm | "select" PrefixTerm | ">!" PrefixTerm. Primary ::= "(" Expression ")" | "exit" | "cat" Parameters | "echo" Parameters | "ls" Parameters | "stdin" | "{" [String {"," String}] "}" | "error" [String] | "suppress" | ">" File | ">>" File | "if" Expression "then" Expression ["else" Expression] "end" ["if"] | "foreach" Expression "then" Expression ["else" Expression] "end" ["foreach"]. | "id" | "count" | "group" | "concatenate" | "uppercase" | "while" Expression "do" Expression "end" ["while"] | "nested" Expression "in" Expression "end" ["nested"] | "whitespace" | "line" | "letters" | "digits" | "substring" String | NativeCommand.