The DSL that we want to implement in this chapter should allow us to write lines containing either a variable consisting of an identifier and an initialization expression (the angle brackets denote non-terminal symbols):
<ID> = <Expression>
or an expression by itself:
<Expression>
If we write something like this
ExpressionsModel: variables += Variable* expressions += Expression* ;
We will not be able to write a program where variables and expressions can be defined in any order; we could only write variables first and then expressions.
To achieve the desired flexibility, we introduce an abstract class for both variable declarations and expressions; then, our model will consist of a (possibly empty) sequence of such abstract elements.
For the moment, we consider a very simple kind of expression: integer constants. These are the first rules (we skip the initial declaration parts of the grammar):
ExpressionsModel: elements += AbstractElement...