% here's the example
\input generic.tex
\input bnf.tex

\begingrammar
%		
<input>:	{$\phi$};
		<statement>.\par

<statement>:	"$\{$" <compound> "$\}$" [";"] ;
		<single> [";"] ;
		";".

<compound>:	<single> ";" <compound> ;
		<single>.

<single>:	"if" "(" <expression> ")" <statement> ["else" <statement>];
		"case" "$\{$" <case-body> "$\}$";
		"for" "(" <expression> ";" <expression> ";" <expression> ")",
			<statement>;
		"while" "(" <expression> ")" <statement>;
		"do" <expression> "while" "(" <expression> ")";
		"sum" "(" <expression> ";" <expression> ")" <statment>;
		"product" "(" <expression> ";" <expression> ")" <statment>;
		"break";
		"continue";
		"return" <expression>;
		"clear";
		"load" <expression>;
		"save" <expression>;
		"release" <expression>;
		"show" ["variables" | "functions" | "set" | "all" | <expression>];
		"set"  ["prompt" | "precision"] [<expression>];
		<equation>.

<case-body>:	"case" <expression> ":" <compound> <case-body>;
		 "default:" <compound>

<equation>:	<var> "=" <expression>;
		<var>"[" <selector> "]" = <expression>;
		<function> = <input>;
		<expression>.

<selector>:	<factor> "," <factor>;
		<factor> ",";
		"," <factor>.

<expression>:	<term> "+" <expression>;
		<term> "--" <expression>.		

<term>:		<factor> <operator> <term>.

<factor>	<pre-op> <factor$'$> <post-op>.

<factor$'$>:	<number>;
		"+" <number>;
		"--" <number>;
		"(" <number> ")";
		<variable>;
		<variable>"[" <selector> "]";
		<string>;
		<matrix>;
		<function>.

<pre-op>:	"++" | "--{\kern 1pt}--" | "$\sim$" | "!".

<post-op>:	"$\uparrow$" <factor> 
		| "**" <factor>;
		"++" | "--{\kern 1pt}--" | "!".		

<matrix>:	"[" <row-list> "]".

<row-list>:	"[" <value-list> "]" [","] <row-list>;
		"[" <value-list> "]" [","] <row-list>;
		<value-list>.

<value-list>:	[ <string> ] <expression> "," <value-list>;
		[ <string> ] <expression>.

<function>:	<variable> "(" <arg-list> ")".

<arg-list>:	$\phi$;
		<variable> "," <arglist>;
		"\dots".

<string>:	" `` "  <anything> " '' ".

<number>:	<real-number>;
		"$\{$" <real-number> "," <real-number> "$\}$";
		{$\backslash$}b[01][01]+;
		{$\backslash$}o[07][07]+;
		\$[0-9A-Fa-f][0-9A-Fa-f]+.

%<real-number>:	[\+--]?[0-9][0-9]+[\.[0-9]+]?[[eE][0-9][0-9]+].

<operator>:	"*" |	 "/"	|     "$\backslash$"	| "\%";
		"==" |	 "!="	|     "$>$" 		| "$<$"  
		| "$<$=" | "$>$=";
		"\ul ="	| "\ul !=" |  "\ul $<$" | "\ul $>$" 
		| "\ul$<$=" | "\ul$>$=";
		"\&"	 | "$\vert$"  | "$\uparrow\uparrow$";
		"\&\&"	| "$\Vert$"  | "\ul$\uparrow$".
		
\endgrammar
\bye