


Gramatiko de modela lingvo
tuto = esprimo "." .
esprimo = termo {("+" | "-") termo}.
termo = faktoro {"*" faktoro}.
faktoro = nomo | "(" esprimo ")".
nomo = litero.
La programo en Paskalo
PROGRAMO postmetu(enigo,eligo);
{ traduku la "tuto"n de "esprimo" el la modela lingvo
al postmeta operaciskribo }
MARKO 13; {erarmarko: antaŭtempa dosierfino}
VAR s: signa; {la kuranta signo ankoraŭ ne fintraktita}
PROCEDURO simbolon; {legu en s-on la sekvan signifan simbolon}
STARTO
RIPETU
SE doFin(enigo) TIAM AL 13;
legu(s)
ĜIS s ≠ ' ' {preterigu brusignojn: spacetojn, linifinojn}
FINO; (*de simbolon*)
PROCEDURO esprimo; {esprimo havas eningigitajn procedurojn}
VAR op: signa; {postmetenda operacisigno}
PROCEDURO termo; {termo = faktoro*faktoro...}
PROCEDURO faktoro; STARTO {faktoro ne havas lokaĵojn}
SE s = '(' TIAM STARTO
simbolon; esprimo;
FINO ALIE skribu(s);
simbolon; {rezignu la fintraktitan s-on, legu freŝan}
FINO; {de faktoro}
STARTO {--- la korpo de termo}
faktoro;
DUM s = '*' FARU STARTO
simbolon;
faktoro;
skribu('*');
FINO
FINO; {--- finiĝis termo}
STARTO {--- la korpo de esprimo}
termo;
DUM (s = '+') AŬ (s = '-') FARU STARTO
op := s;
simbolon;
termo;
skribu(op);
FINO
FINO; {--- finiĝis esprimo}
STARTO
simbolon; esprimo; skribuLin; {--- kontrolendus: s='.'}
13:FINO.