
A Gentle specification is a list of declarations.
A declaration may introduce a data type as in
'type' Expr
plus(Expr, Expr)
minus(Expr, Expr)
mult(Expr, Expr)
div(Expr, Expr)
neg(Expr)
num(INT)
a predicate as in
'action' eval (Expr -> INT)
'rule' eval(plus(X1, X2) -> N1+N2): eval(X1 -> N1) eval(X2 -> N2)
'rule' eval(minus(X1, X2) -> N1-N2): eval(X1 -> N1) eval(X2 -> N2)
'rule' eval(mult(X1, X2) -> N1*N2): eval(X1 -> N1) eval(X2 -> N2)
'rule' eval(div(X1, X2) -> N1 / N2): eval(X1 -> N1) eval(X2 -> N2)
'rule' eval(neg(X) -> -N): eval(X -> N)
'rule' eval(num(N) -> N)
a global variable as in
'var' CurLoopContext: LoopContextor a global table as in
'table' Label (Address: INT)Declarations may be given in any order.
One of the declarations must be a root definition. It consists of the the keyword 'root' followed by one or more statements. The program generated from the specification elaborates these statements.
Consider
'root' expression(-> X) code(X)Here, expression is elaborated first yielding a value X, then code is elaborated with X as an argument. expression and code must be declared as predicates.
Here is a complete Gentle specification
'root' print("Hello World!")
using the predefined predicate print.
Comments of the first form start with `` -'' and finish at the end of the line. For example,
-- this comment extends to the end of the lineThe second form is text enclosed in `` /*'' and `` */'', these comments can range over several lines. E.g.
/* this comment
ranges over two lines */
Comments of the second form may be nested.
This is of particular value because it allows us to ``comment out''
a text without bothering whether the text contains comments.