| term-read-in  | ::= subterm(1200) full-stop
  | 
  | 
| subterm(N)  | ::= term(M)  | { where M is less than or equal to N }
  | 
  | 
| term(N)  | ::= op(N,fx) subterm(N-1)  | { except in the case of a number if subterm starts with a ‘(’, op must be followed by whitespace-text }
  | 
 | |  op(N,fy) subterm(N)  | { if subterm starts with a ‘(’, op must be followed by whitespace-text }
  | 
 | |  subterm(N-1) op(N,xfx) subterm(N-1)
  | 
 | |  subterm(N-1) op(N,xfy) subterm(N)
  | 
 | |  subterm(N) op(N,yfx) subterm(N-1)
  | 
 | |  subterm(N-1) op(N,xf)
  | 
 | |  subterm(N) op(N,yf)
  | 
  | 
| term(1100)  | ::= subterm(1099) | subterm(1100)  | { term with functor ;/2 }
  | 
| term(1000)  | ::= subterm(999) , subterm(1000)  | { term with functor ','/2 }
  | 
  | 
| term(0)  | ::= functor ( arguments )  | { provided there is no whitespace-text between the functor and the ‘(’ }
  | 
 | |  ( subterm(1200) )
  | 
 | |  { subterm(1200) }
  | 
 | |  list
  | 
 | |  string
  | 
 | |  constant
  | 
 | |  variable
  | 
  | 
| op(N,T)  | ::= name  | { where name has been declared as an operator of type T and precedence N }
  | 
  | 
| arguments  | ::= subterm(999)
  | 
 | |  subterm(999) , arguments
  | 
  | 
| list  | ::= []
  | 
 | |  [ listexpr ]
  | 
  | 
| listexpr  | ::= subterm(999)
  | 
 | |  subterm(999) , listexpr
  | 
 | |  subterm(999) | subterm(999)
  | 
  | 
| constant  | ::= atom | number
  | 
  | 
| number  | ::= unsigned-number
  | 
 | |  sign unsigned-number
  | 
 | |  sign inf
  | 
 | |  sign nan
  | 
  | 
| unsigned-number  | ::= natural-number | unsigned-float
  | 
  | 
| atom  | ::= name
  | 
  | 
| functor  | ::= name
   
  |