La barrière syntaxique est constituée d'une longue kyrielle de
fonctions pour reconnaître (reconnaisseurs qui ont pour type de
résultat
bool) et extraire (accesseurs) de l'information des
diverses formes syntaxiques possibles. Contrairement à ce que nous
avons fait jusqu'alors, elles sont données règle de grammaire par
règle de grammaire et non en écrivant d'abord les reconnaisseurs puis
les accesseurs.
Règle
expression := ... (début)
108 |
;;; variable?: Expression -> bool |
124 |
;;; citation?: Expression -> bool |
133 |
;;; conditionnelle?: Expression -> bool |
137 |
;;; conditionnelle-clauses: Conditionnelle -> LISTE[Clause] |
141 |
;;; alternative?: Expression -> bool |
145 |
;;; alternative-condition: Alternative -> Expression |
149 |
;;; alternative-consequence: Alternative -> Expression |
153 |
;;; alternative-alternant: Alternative -> Expression |
159 |
;;; sequence?: Expression -> bool |
163 |
;;; sequence-exps: Sequence -> LISTE[Expression] |
Noter, encore une fois, comme ces spécifications suivent la grammaire.
Pour l'implantation, rien à dire, hormis peut-être les implantations
un peu longues de
variables? (pour exclure les mots-clefs) et
citation? (car nous avons mis ensemble les constantes et les données
« quotées »).
Noter la définition de
alternative-alternant : l'alternant
est facultatif. Lorsque la condition est fausse et que l'alternant est
absent, la fonction
alternative-alternant retourne false, ce
qui est permis par la norme de Scheme.
Règle
expression := ... (suite et fin)
167 |
;;; bloc?: Expression -> bool |
171 |
;;; bloc-liaisons: Bloc -> LISTE[Liaison] |
175 |
;;; bloc-corps: Bloc -> Corps |
179 |
;;; application?: Expression -> bool |
183 |
;;; application-fonction: Application -> Expression |
187 |
;;; application-arguments: Application -> LISTE[Expression] |
On suit toujours la règle de grammaire...
Règle
clause := ...
191 |
;;; clause-condition: Clause -> Expression |
195 |
;;; clause-expressions: Clause -> LISTE[Expression] |
Rien à dire...
Règle
liaison := ...
199 |
;;; liaison-variable: Liaison -> Variable |
203 |
;;; liaison-exp: Liaison -> Expression |
Rien à dire...
Règle
corps := ...
207 |
;;; definition?: Corps -> bool |
|
;;; (definition? corps) rend #t ssi le premier élément du corps |
|
;;; "corps" est une définition |
Ici, nous avons donné la spécification complète car c'est une forme de
règle de grammaire que nous n'avons encore pas vue: un corps est une
suite (éventuellement vide) de définitions suivie d'une suite (non
vide) d'expressions. Deux applications de cette règle diffèrent donc
-- et c'est pourquoi nous donnons un reconnaisseur -- selon que le
premier élément est, ou n'est pas, une définition:
Règle
definition := ...
213 |
;;; definition-nom-fonction: Definition -> Variable |
217 |
;;; definition-variables: Definition -> LISTE[Variable] |
221 |
;;; definition-corps: Definition -> Corps |
Facile...