In order for a parser to be able to understand a program, it needs a formal description of that language-a grammar. In this chapter, we will work with a so-called parsing expression grammar (PEG). A PEG is (relatively) easy to define and there are libraries that can generate a parser for a given grammar automatically.
A grammar consists of terminal symbols and non-terminal symbols. A non-terminal symbol is a symbol that maybe composed of several other symbols, following certain rules (production rules). For example, a grammar could contain a number as non-terminal symbol. Each number could be defined as an arbitrary-length sequence of digits. As a digit could then be any of the characters from 0 to 9 (with each of the actual digits being a terminal symbol).
Let's try to describe the structure of numbers (and then building on this mathematical expressions in general) formally. Let's start by describing how a number looks like. Each number consists of one or more digits...