The grammar for the Expressions DSL
The DSL that we want to implement in this chapter should allow us to write lines containing either a variable declaration consisting of the keyword "var", an identifier and an initialization expression (the angle brackets denote non-terminal symbols):
var <ID> = <Expression>
Or the evaluation of an expression, consisting of the keyword "eval" and the expression to evaluate:
eval <Expression>
If we write something as follows:
ExpressionsModel: variables += Variable* evaluations += EvalExpression* ;
We will not be able to write a program where variables and evaluations can be defined in any order; we can only write variables first and then evaluations.
To achieve the desired flexibility, we introduce an abstract class for both variable declarations and evaluations; 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...