Syntax of ALGOL 60


<program> ::= <block> | <compound statement>
	<block> ::= <unlabelled block> | <label>: <block>
		<unlabelled block> ::= <block head> ; <compound tail>
		<block head> ::= 'BEGIN' <declaration> | <block head> ; <declaration>
	<compound statement> ::= <unlabelled compound> | <label>: <compound statement>
		<unlabelled compound> ::= 'BEGIN' <compound tail>
		<compound tail> ::= <statement> 'END' | <statement> ; <compound tail>

<declaration> ::= <type declaration> | <array declaration> | <switch declaration> | <procedure declaration>
	<type declaration> ::= <local or own type> <type list>
		<local or own type> ::= <type> | 'OWN' <type>
			<type> ::= 'REAL' | 'INTEGER' | 'BOOLEAN'
		<type list> ::= <simple variable> | <simple variable> , <type list>
	<array declaration> ::= 'ARRAY' <array list> | <local or own type> 'ARRAY' <array list>
		<array list> ::= <array segment> | <array list> , <array segment>
			<array segment> ::= <array identifier> [ <bound pair list> ] | <array identifier> , <array segment>
				<array identifier> ::= <identifier>
				<bound pair list> ::= <bound pair> |  <bound pair list> , <bound pair>
					<bound pair> ::= <lower bound> : <upper bound>
						<upper bound> ::= <arithmetic expression>
						<lower bound> ::= <arithmetic expression>
	<switch declaration> ::= 'SWITCH' <switch identifier> := <switch list>
		<switch identifier> ::= <identifier>
		<switch list> ::= <designational expression> | <switch list> , <designational expression>
	<procedure declaration> ::= 'PROCEDURE' <procedure heading> <procedure body> | <type> 'PROCEDURE' <procedure heading> <procedure body>
		<procedure heading> ::= <procedure identifier> <formal parameter part> ; <value part> <specification part>
			<procedure identifier> ::= <identifier>
			<formal parameter part> ::= <empty> | ( <formal parameter list> )
				<formal parameter list> ::= <formal parameter> | <formal parameter list> <parameter delimiter> <formal parameter>
					<formal parameter> ::= <identifier> 
			<value part> ::= 'VALUE' <identifier list> ; | <empty>
			<specification part> ::= <empty> | <specifier> <identifier list> ; | <specification part> <specifier> <identifier list>
				<specifier> ::= 'STRING' | <type> | 'ARRAY' | <type> 'ARRAY' | 'LABEL' | 'SWITCH' | 'PROCEDURE' | <type> 'PROCEDURE'
				<identifier list> ::= <identifier> | <identifier list> , <identifier>
		<procedure body> ::= <statement> | <code>

<statement> ::= <unconditional statement> | <conditional statement> | <for statement>
	<unconditional statement> ::= <basic statement> | <compound statement> | <block>
		<basic statement> ::= <unlabelled basic statement> | <label>: <basic statement>
			<label> ::= <identifier> | <unsigned integer>
			<unlabelled basic statement> ::= <assignment statement> | <go to statement> | <dummy statement> | <procedure statement>
				<assignment statement> ::= <left part list> <arithmetic expression> | <left part list> <Boolean expression>
					<left part list> ::= <left part> | <left part list> <left part>
						<left part> ::= <variable> := | <procedure identifier> :=
				<go to statement> ::= 'GOTO' <designational expression>
					<designational expression> ::= <simple designational expression> |
					                               <if clause> <simple designational expression> 'ELSE' <designational expression>
					<simple designational expression> ::= <label> | <switch designator> | (<designational expression>)
						<switch designator> ::= <switch identifier> [<subscript expression>]
				<dummy statement> ::= <empty>
				<procedure statement> ::= <procedure identifier> <actual parameter part>
					<actual parameter part> ::= <empty> | ( <actual parameter list> )
						<actual parameter list> ::= <actual parameter> | <actual parameter list> <parameter delimiter> <actual parameter>
							<parameter delimiter> ::= , | ) <letter string> : (
							<actual parameter> ::= <string> | <expression> | <array identifier> | <switch identifier> | <procedure identifier>
	<conditional statement> ::= <if statement> | <if statement> 'ELSE' <statement> | <if clause> <for statement> | <label>: <conditional statement>
		<if statement> ::= <if clause> <unconditional statement>
			<if clause> ::= 'IF' <Boolean expression> 'THEN'
	<for statement> ::= <for clause> <statement> | <label>: <for statement>
		<for clause> ::= 'FOR' <variable> := <for list> 'DO'
			<for list> ::= <for list element> | <for list> , <for list element>
				<for list element> ::= <arithmetic expression> |
				                       <arithmetic expression> 'STEP' <arithmetic expression> 'UNTIL' <arithmetic expression> |
				                       <arithmetic expression> 'WHILE' <Boolean expression>

<expression> ::= <arithmetic expression> | <Boolean expression> | <designational expression>
	<arithmetic expression> ::= <simple arithmetic expression> | <if clause> <simple arithmetic expression> 'ELSE' <arithmetic expression>
		<simple arithmetic expression> ::= <term> | <adding operator> <term> | <simple arithmetic expression> <adding operator> <term>
			<adding operator> ::= + | -
			<term> ::= <factor> | <term> <multiplying operator> <factor>
				<multiplying operator> ::= * | / | ÷
				<factor> ::= <primary> | <factor> | <factor> 'POWER' <primary>
					<primary> ::= <unsigned number> | <variable> | <function designator> | ( <arithmetic expression> )
						<unsigned number> ::= <decimal number> | <exponential part> | <decimal number> <exponential part>
							<decimal number> ::= <unsigned integer> | <decimal fraction> | <unsigned integer> <decimal fraction>
								<unsigned integer> ::= <digit> | <unsigned integer> <digit>
								<decimal fraction> ::= . <unsigned integer>
							<exponential part> ::= E <integer>
								<integer> ::= <unsigned integer> | + <unsigned integer> | - <unsigned integer>
	<Boolean expression> ::= <simple Boolean> | <if clause> <simple Boolean> 'ELSE' <Boolean expression>
		<simple Boolean> ::= <implication> | <simple Boolean> 'EQUIV' <implication>
			<implication> ::= <Boolean term> | <implication> 'IMPL' <Boolean term>
				<Boolean term> ::= <Boolean factor> | <Boolean term> 'OR' <Boolean factor>
				<Boolean factor> ::= <Boolean secondary> | <Boolean factor> 'AND' <Boolean secondary>
					<Boolean secondary> ::= <Boolean primary> | 'NOT' <Boolean primary>
						<Boolean primary> ::= <logical value> | <variable> | <function designator> | <relation> | ( <Boolean expression> )
							<relation> ::= <simple arithmetic expression> <relational operator> <simple arithmetic expression>
								<relational operator> ::= < | ¾ | = | „ | > | ‚ |
								                          'LESS' | 'NOTGREATER' | 'EQUAL' | 'NOTLESS' | 'GREATER' | 'NOTEQUAL'
							<function designator> ::= <procedure identifier> <actual parameter part>

<variable> ::= <simple variable> | <subscripted variable>
	<simple variable> ::= <variable identifier>
			<variable identifier> ::= <identifier>
<subscripted variable> ::= <array identifier> [ <subscript list> ]
	<subscript list> ::= <subscript expression> | <subscript list> , <subscript expression>
		<subscript expression> ::= <arithmetic expression>

<string> ::= "<open string>"
	<open string> ::= <proper string> "<open string>" | <open string><open string>
	<proper string> ::= <any sequence of symbols not containing " > | <empty>

<letter string> ::= <letter> | <letter string> <letter>

<identifier> ::= letter> | <identifier> <letter> | <identifier> <digit>

<basic symbol> ::= <letter> | <digit> | <logical value> | <delimiter>

<letter> ::= a | b | c | d | e | f | g | h | i | j | k | l |
             m | n | o | p | q | r | s | t | u | v | w | x | y | z | A |
             B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
             Q | R | S | T | U | V | W | X | Y | Z
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 
<logical value> ::= 'TRUE' | 'FALSE'

<delimiter> ::= <operator> | <separator> | <bracket> | <declarator> | <specificator>

<operator> ::= <arithmetic operator> | <relational operator> | <logical operator> | <sequential operator>
<arithmetic operator> ::= + | - | * | / | ÷ | 'POWER'
<relational operator> ::= < | ¾ | = | „ | > | ‚ |
                          'LESS' | 'NOTGREATER' | 'EQUAL' | 'NOTLESS' | 'GREATER' | 'NOTEQUAL'
<logical operator> ::= 'EQUIV' | 'IMPL' | 'OR' | 'AND' | 'NOT'
<sequential operator> ::= 'GOTO' | 'IF' | 'THEN' | 'ELSE' | 'FOR' | 'DO'

<separator> ::= , | . | E | : | ; | := | _ | 'STEP' | 'UNTIL' | 'WHILE' | 'COMMENT'
<bracket> ::= ( | ) | [ | ] | ` | ' | 'BEGIN' | 'END'
<declarator> ::= 'OWN' | 'BOOLEAN' | 'INTEGER' | 'REAL' | 'ARRAY' | 'SWITCH' | 'PROCEDURE'
<specificator> ::= 'STRING' | 'LABEL' | 'VALUE'