Expression ::= ProducerPrimary {"|" TransducerPrimary} ["|" ConsumerPrimary]. ProducerExpression ::= ProducerPrimary | ProducerPrimary "|" TransducerExpression. ProducerPrimary ::= "(" NativeCommand ")" ">" | "cat" Parameters | "echo" Parameters | "ls" Parameters | "stdin" | "{" [String {"," String}] "}" | "(" ProducerExpression ")". ConsumerExpression ::= ConsumerFork | TransducerExpression "|" ConsumerFork. ConsumerFork ::= ConsumerPrimary {"tee" ConsumerPrimary}. ConsumerPrimary ::= "(" ConsumerExpression ")" | ">" "(" NativeCommand ")" | "error" [String] | "null" | ">" File | ">>" File. TransducerExpression ::= TransducerPrimary {"|" TransducerPrimary} | TransducerPrimary {"><" TransducerPrimary}. TransducerPrimary ::= "(" TransducerExpression ")" | "id" | "suppress" | "count" | "group" | "concatenate" | "uppercase" | "prepend" String | "append" String | "substitute" String | "select" SplitterPrimary | "if" SplitterExpression "then" TransducerExpression ["else" TransducerExpression] "end" ["if"] | "while" SplitterExpression "do" TransducerExpression "end" ["while"] | "foreach" SplitterExpression "then" TransducerExpression ["else" TransducerExpression] "end" ["foreach"] | NativeCommand. SplitterExpression ::= SplitterPrimary {"&&" SplitterPrimary} | SplitterPrimary {"||" SplitterPrimary} | SplitterPrimary {">&" SplitterPrimary} | SplitterPrimary {">|" SplitterPrimary} | SplitterPrimary {">," SplitterPrimary} | SplitterPrimary "having" SplitterPrimary | SplitterPrimary "having-only" SplitterPrimary | SplitterPrimary "..." SplitterPrimary | "first" SplitterPrimary | "last" SplitterPrimary | "prefix" SplitterPrimary | "suffix" SplitterPrimary. SplitterPrimary ::= "(" SplitterExpression ")" | ">!" SplitterPrimary | "whitespace" | "line" | "letters" | "digits" | "substring" String | "nested" SplitterExpression "in" SplitterExpression "end" ["nested"] | "between" SplitterExpression "and" SplitterExpression "end" ["between"].