Scan.pco)
{ AOP_token: 1;
CAT_token: 2;
CEQ_token: 3;
COL_token: 4;
COM_token: 5;
END_token: 6;
FRC_token: 7;
LBC_token: 8;
LBR_token: 9;
LPR_token: 10;
MOP_token: 11;
NAM_token: 12;
NBR_token: 13;
RBC_token: 14;
RBR_token: 15;
ROP_token: 16;
RPR_token: 17;
SMC_token: 18;
TXT_token: 19;
XOP_token: 20;
scan_data: void;
scan():
error('scanner not initialized');
init_scan(Str):
{ aop: 1;
apo: 2;
bkq: 3;
cat: 4;
col: 5;
com: 6;
dgt: 7;
eol: 8;
eql: 9;
exp: 10;
ill: 11;
lbc: 12;
lbr: 13;
lpr: 14;
ltr: 15;
mns: 16;
mop: 17;
per: 18;
pls: 19;
quo: 20;
rbc: 21;
rbr: 22;
rop: 23;
rpr: 24;
smc: 25;
wsp: 26;
xop: 27;
siz: 27;
ch_tab: [`end` wsp, wsp, wsp, wsp, wsp, wsp, wsp,
wsp, wsp, wsp, wsp, wsp, eol, wsp, wsp,
wsp, wsp, wsp, wsp, wsp, wsp, wsp, wsp,
wsp, wsp, wsp, wsp, wsp, wsp, wsp, wsp,
wsp, xop, quo, rop, aop, aop, mop, apo,
lpr, rpr, mop, pls, com, mns, per, mop,
dgt, dgt, dgt, dgt, dgt, dgt, dgt, dgt,
dgt, dgt, col, smc, rop, eql, rop, xop,
cat, ltr, ltr, ltr, ltr, exp, ltr, ltr,
ltr, ltr, ltr, ltr, ltr, ltr, ltr, ltr,
ltr, ltr, ltr, ltr, ltr, ltr, ltr, ltr,
ltr, ltr, ltr, lbr, mop, rbr, xop, ltr,
ill, ltr, ltr, ltr, ltr, exp, ltr, ltr,
ltr, ltr, ltr, ltr, ltr, ltr, ltr, ltr,
ltr, ltr, ltr, ltr, ltr, ltr, ltr, ltr,
ltr, ltr, ltr, lbc, aop, rbc, aop, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill ];
input: void;
pos: 0;
hold: 0;
ch: 0;
skip_ch():
ch:= if(pos > size(input),
0,
if((pos:= pos+1) > size(input),
32,
ord(input[pos])));
next_ch(Tkn):
{ skip_ch();
Tkn };
freeze():
hold:= pos;
capture_name(Tkn):
{ t[pos-hold]: input[(hold:= hold+1)-1];
scan_data:= implode(t);
Tkn };
capture_text(Tkn):
{ t[pos-hold-1]: input[(hold:= hold+1)-1];
scan_data:= implode(t);
Tkn };
capture_number(Tkn):
{ t[pos-hold]: input[(hold:= hold+1)-1];
scan_data:= number(implode(t));
Tkn };
check(allowed):
if(ch = 0, false, allowed[ch_tab[ch]]);
uncheck(allowed):
if(ch = 0, false, not(allowed[ch_tab[ch]]));
mask@list:
{ msk[siz]: false;
for(k: 1, k:= k+1, not(k > size(list)),
msk[list[k]]:= true);
msk };
apo_allowed: mask(apo);
apx_allowed: mask(apo,eol);
bkq_allowed: mask(bkq,eol);
dgt_allowed: mask(dgt);
eql_allowed: mask(eql);
exp_allowed: mask(exp);
nam_allowed: mask(dgt,exp,ltr);
opr_allowed: mask(aop,eql,mns,mop,pls,rop,xop);
per_allowed: mask(per);
quo_allowed: mask(quo);
qux_allowed: mask(eol,quo);
sgn_allowed: mask(pls,mns);
wsp_allowed: mask(wsp,eol);
operator(Tkn):
{ freeze();
until(uncheck(opr_allowed), skip_ch());
capture_name(Tkn) };
exponent():
{ skip_ch();
if(check(sgn_allowed), skip_ch(), void);
if(check(dgt_allowed),
until(uncheck(dgt_allowed), skip_ch()),
error('digit required'));
capture_number(FRC_token) };
fraction():
{ skip_ch();
if(check(dgt_allowed),
until(uncheck(dgt_allowed), skip_ch()),
error('digit required'));
if(check(exp_allowed),
exponent(),
capture_number(FRC_token)) };
aop_fun():
operator(AOP_token);
apo_fun():
{ skip_ch();
freeze();
while(uncheck(apx_allowed), skip_ch());
if(check(apo_allowed),
capture_text(next_ch(TXT_token)),
error("' required")) };
bkq_fun():
{ skip_ch();
while(uncheck(bkq_allowed), skip_ch());
skip_ch();
scan() };
cat_fun():
next_ch(CAT_token);
col_fun():
{ skip_ch();
if(check(eql_allowed),
next_ch(CEQ_token),
COL_token) };
com_fun():
next_ch(COM_token);
dgt_fun():
{ freeze();
until(uncheck(dgt_allowed), skip_ch());
if(check(per_allowed),
fraction(),
if(check(exp_allowed),
exponent(),
capture_number(NBR_token))) };
ill_fun():
{ error('illegal character');
END_token };
lbc_fun():
next_ch(LBC_token);
lbr_fun():
next_ch(LBR_token);
lpr_fun():
next_ch(LPR_token);
ltr_fun():
{ freeze();
until(uncheck(nam_allowed), skip_ch());
capture_name(NAM_token) };
mop_fun():
operator(MOP_token);
quo_fun():
{ skip_ch();
freeze();
while(uncheck(qux_allowed), skip_ch());
if(check(quo_allowed),
capture_text(next_ch(TXT_token)),
error('" required')) };
rbc_fun():
next_ch(RBC_token);
rbr_fun():
next_ch(RBR_token);
rop_fun():
operator(ROP_token);
rpr_fun():
next_ch(RPR_token);
smc_fun():
next_ch(SMC_token);
wsp_fun():
{ skip_ch();
scan() };
xop_fun():
operator(XOP_token);
fun_tab: [ aop_fun,
apo_fun,
bkq_fun,
cat_fun,
col_fun,
com_fun,
dgt_fun,
wsp_fun,
rop_fun,
ltr_fun,
ill_fun,
lbc_fun,
lbr_fun,
lpr_fun,
ltr_fun,
aop_fun,
mop_fun,
ill_fun,
aop_fun,
quo_fun,
rbc_fun,
rbr_fun,
rop_fun,
rpr_fun,
smc_fun,
wsp_fun,
xop_fun ];
init_scan(Str):=
{ input:= explode(Str);
pos:= 0;
skip_ch();
void };
scan():=
if(ch = 0,
END_token,
{ fun: fun_tab[ch_tab[ch]];
fun() });
init_scan(Str) };
display('scanner installed', eoln) }
This page was made (with lots of hard work!) by Wolfgang De Meuter