Denotational Semantics: A Methodology for Language Development by David A. Schmidt.
From the Preface:
Denotational semantics is a methodology for giving mathematical meaning to programming languages and systems. It was developed by Christopher Strachey’s Programming Research Group at Oxford University in the 1960s. The method combines mathematical rigor, due to the work of Dana Scott, with notational elegance, due to Strachey. Originally used as an analysis tool, denotational semantics has grown in use as a tool for language design and implementation.
This book was written to make denotational semantics accessible to a wider audience and to update existing texts in the area. I have presented the topic from an engineering viewpoint, emphasizing the descriptional and implementational aspects. The relevant mathematics is also included, for it gives rigor and validity to the method and provides a foundation for further research.
The book is intended as a tutorial for computing professionals and as a text for university courses at the upper undergraduate or beginning graduate level. The reader should be acquainted with discrete structures and one or more general purpose programming languages. Experience with an applicative-style language such as LISP, ML, or Scheme is also helpful.
You can document the syntax of a programming language using some variation of BNF.
Documenting the semantics of a programming language is a bit tougher.
Denotational semantics is one approach. Other approaches include: Axiomatic semantics and Operational semantics.
Even if you are not interested in proving the formal correctness of program, the mental discipline required by any of these approaches is useful.