Sostituzione
Una regola
rule FIGUREBASE{ /* ... */ }
specifica un elenco di nomi di figure primitive, eventualmente con parametri
startshape FIGUREBASE
rule FIGUREBASE
{
SQUARE{}
CIRCLE{x -1}
TRIANGLE{x +1}
}
rule FIGUREBASE
{
SQUARE{}
CIRCLE{x -1}
TRIANGLE{x +1}
}

oppure un elenco di regole, eventualmente con parametri
startshape FIGUREBASE
rule FIGUREBASE
{
FIGURA1{}
FIGURA2{}
FIGURA3{}
}
rule FIGURA1
{
SQUARE{}
}
rule FIGURA2
{
CIRCLE{x -1}
}
rule FIGURA3
{
TRIANGLE{x +1}
}
rule FIGUREBASE
{
FIGURA1{}
FIGURA2{}
FIGURA3{}
}
rule FIGURA1
{
SQUARE{}
}
rule FIGURA2
{
CIRCLE{x -1}
}
rule FIGURA3
{
TRIANGLE{x +1}
}
oppure sia nomi di figure che regole
startshape FIGUREBASE
rule FIGUREBASE
{
SQUARE{}
FIGURA2{}
}
rule FIGURA2
{
CIRCLE{x -1}
FIGURA3{}
}
rule FIGURA3
{
TRIANGLE{x +1}
}
rule FIGUREBASE
{
SQUARE{}
FIGURA2{}
}
rule FIGURA2
{
CIRCLE{x -1}
FIGURA3{}
}
rule FIGURA3
{
TRIANGLE{x +1}
}
I tre codici precedenti producono la stessa immagine...
ContextFree segue il percorso delle regole, a partire da quella specificata con startshape, e effettuando una sorta di sostituzione di ogni regola con la definizione corrispondente, continua finché ottiene una sequenza di specifiche di figure primitive che costituiscono il risultato finale.
Nel primo caso
FIGUREBASE{} ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}
Nel secondo
FIGUREBASE{} ==> FIGURA1{} | FIGURA2{} | FIGURA3{}
............ ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}
............ ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}
Nel terzo
FIGUREBASE{} ==> SQUARE{} | FIGURA2{}
............ ==> SQUARE{} | CIRCLE{x -1} | FIGURA3{}
............ ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}
............ ==> SQUARE{} | CIRCLE{x -1} | FIGURA3{}
............ ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}