Read.pco
)
{ read(Str): { token: void; begin_str: 'begin'; tab_str: 'tab'; msg_tab: [ 'additive operator', 'application', 'assignment', 'definition', 'comma', 'end of text', 'fraction', 'left brace', 'left bracket', 'left parenthesis', 'multiplicative operator', 'name', 'number', 'right brace', 'right bracket', 'relational operator', 'right parenthesis', 'semicolon', 'text', 'exponentiation operator' ]; message@any: error('Unexpected ', msg_tab[token]); skip(): token:= scan(); next(Dat): { skip(); Dat }; expression(): void; reference(): void; operation(Opr, Tkn): { opd: Opr(); while(token = Tkn, { opr: next(scan_data); arg: [ opd, Opr() ]; opd:= APL(opr,TAB(arg)) }); opd }; list(Sep, Trm): { loop(count): { exp: expression(); if(token = Sep, { skip(); tab: loop(count+1); tab[count]:= exp }, if(token = Trm, { skip(); tab[count]: void; tab[count]:= exp }, message())) }; TAB(loop(1)) }; number(): NBR(next(scan_data)); fraction(): FRC(next(scan_data)); text(): TXT(next(scan_data)); application(Var): { skip(); if(token = RPR_token, APL(Var, next(Empty)), APL(Var, list(COM_token, RPR_token))) }; apply(Var): { skip(); ref: reference(); APL(Var, ref) }; tabulation(Var): { skip(); idx: expression(); if(token = RBR_token, skip(), message()); TBL(Var, idx) }; variable(Var): VAR(Var); prefix(Var): { arg: [ reference() ]; APL(Var, TAB(arg)) }; var_case: case(LPR_token => application, LBR_token => tabulation, CAT_token => apply, else => variable); name(): { var: next(scan_data); cas: var_case(token); cas(var) }; opr_case: case(NBR_token => prefix, FRC_token => prefix, TXT_token => prefix, NAM_token => prefix, ROP_token => prefix, AOP_token => prefix, MOP_token => prefix, XOP_token => prefix, LPR_token => application, CAT_token => apply, LBR_token => tabulation, else => variable); operator(): { opr: next(scan_data); cas: opr_case(token); cas(opr) }; parentheses(): { skip(); exp: expression(); if(token = RPR_token, skip(), message()); exp }; braces(): { skip(); APL(begin_str, list(SMC_token, RBC_token)) }; brackets(): { skip(); if(token = RBR_token, APL(tab_str, next(Empty)), APL(tab_str, list(COM_token, RBR_token))) }; ref_case: case(NBR_token => number, FRC_token => fraction, TXT_token => text, NAM_token => name, ROP_token => operator, AOP_token => operator, MOP_token => operator, XOP_token => operator, LPR_token => parentheses, LBC_token => braces, LBR_token => brackets, else => message); reference():= { cas: ref_case(token); cas() }; factor(): operation(reference, XOP_token); term(): operation(factor, MOP_token); comparand(): operation(term, AOP_token); invocation(): operation(comparand, ROP_token); identity(Inv): Inv; definition(Inv): DEF(next(Inv), expression()); assignment(Inv): SET(next(Inv), expression()); exp_case: case(COL_token => definition, CEQ_token => assignment, else => identity); expression():= { inv: invocation(); cas: exp_case(token); cas(inv) }; read(Str):= { init_scan(Str); token := scan(); expression() }; read(Str) }; display('reader installed', eoln) }
This page was made (with lots of hard work!) by Wolfgang De Meuter