RosettaCodeData/Task/Brace-expansion/Simula/brace-expansion-2.simula
2023-07-01 13:44:08 -04:00

150 lines
4.2 KiB
Text

EXTERNAL CLASS ARRAYLISTS;
ARRAYLISTS
BEGIN
CLASS TUPLE(TLIST,T);
REF(TEXTARRAYLIST) TLIST;
TEXT T;
BEGIN
END TUPLE;
REF(TUPLE) PROCEDURE GETITEM(S, DEPTH);
TEXT S;
INTEGER DEPTH;
BEGIN
REF(TUPLE) RESULT;
REF(TEXTARRAYLIST) OUT;
OUT :- NEW TEXTARRAYLIST;
OUT.ADD("");
CONTINUE:
WHILE S.LENGTH > 0 DO BEGIN
CHARACTER C;
TEXT CTEXT;
S.SETPOS(1); C := S.GETCHAR; CTEXT :- BLANKS(1); CTEXT.PUTCHAR(C);
IF DEPTH > 0 AND (C = ',' OR C = '}') THEN
GOTO RETURN;
IF C = '{' THEN BEGIN
REF(TUPLE) X;
X :- GETGROUP(S.SUB(2,S.LENGTH-1), DEPTH + 1);
IF X =/= NONE THEN BEGIN
REF(TEXTARRAYLIST) OUT2;
INTEGER A,B;
! OUT,S = [A+B FOR A IN OUT FOR B IN X[0]], X[1] ;
OUT2 :- NEW TEXTARRAYLIST;
FOR A := 1 STEP 1 UNTIL OUT.SIZE DO
FOR B := 1 STEP 1 UNTIL X.TLIST.SIZE DO
OUT2.ADD(OUT.GET(A) & X.TLIST.GET(B));
OUT :- OUT2;
S :- X.T;
GOTO CONTINUE;
END;
END;
IF C = '\' AND S.LENGTH > 1 THEN BEGIN
TEXT NEWCTEXT;
NEWCTEXT :- BLANKS(CTEXT.LENGTH + 1);
NEWCTEXT := CTEXT;
NEWCTEXT.SETPOS(CTEXT.LENGTH+1);
S.SETPOS(2); NEWCTEXT.PUTCHAR(S.GETCHAR);
CTEXT :- NEWCTEXT;
S :- S.SUB(2,S.LENGTH-1);
END;
BEGIN
REF(TEXTARRAYLIST) OUT2;
INTEGER A;
! OUT, S = [A+CTEXT FOR A IN OUT], S[1:] ;
OUT2 :- NEW TEXTARRAYLIST;
FOR A := 1 STEP 1 UNTIL OUT.SIZE DO
OUT2.ADD(OUT.GET(A) & CTEXT);
OUT :- OUT2;
S :- S.SUB(2,S.LENGTH-1);
END;
END;
RETURN:
RESULT :- NEW TUPLE(OUT,S);
GETITEM :- RESULT;
END GETITEM;
REF(TUPLE) PROCEDURE GETGROUP(S, DEPTH);
TEXT S;
INTEGER DEPTH;
BEGIN
REF(TUPLE) RESULT;
REF(TEXTARRAYLIST) OUT;
BOOLEAN COMMA,BREAK;
OUT :- NEW TEXTARRAYLIST;
COMMA := FALSE;
BREAK := FALSE;
WHILE S.LENGTH > 0 AND NOT BREAK DO BEGIN
REF(TUPLE) GS;
REF(TEXTARRAYLIST) G;
GS :- GETITEM(S, DEPTH); G :- GS.TLIST; S :- GS.T;
IF S.LENGTH = 0 THEN BREAK := TRUE ELSE
BEGIN
CHARACTER S1;
INTEGER I;
! out += g ;
FOR I := 1 STEP 1 UNTIL G.SIZE DO OUT.ADD(G.GET(I));
S.SETPOS(1); S1 := S.GETCHAR;
IF S1 = '}' THEN BEGIN
IF COMMA THEN BEGIN
BREAK := TRUE;
RESULT :- NEW TUPLE(OUT, S.SUB(2,S.LENGTH-1));
END ELSE
BEGIN
REF(TEXTARRAYLIST) OUT2;
INTEGER I;
OUT2 :- NEW TEXTARRAYLIST;
FOR I := 1 STEP 1 UNTIL OUT.SIZE DO
OUT2.ADD("{" & OUT.GET(I) & "}");
BREAK := TRUE;
RESULT :- NEW TUPLE(OUT2, S.SUB(2,S.LENGTH-1));
END;
END ELSE
IF S1 = ',' THEN BEGIN
COMMA := TRUE;
S :- S.SUB(2,S.LENGTH-1);
END;
END;
END;
GETGROUP :- RESULT;
END GETGROUP;
TEXT INP;
FOR INP :- "~/{Downloads,Pictures}/*.{jpg,gif,png}",
"It{{em,alic}iz,erat}e{d,}, please.",
"{,{,gotta have{ ,\, again\, }}more }cowbell!",
"{}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}" DO
BEGIN
REF(TUPLE) RES;
INTEGER I;
RES :- GETITEM(INP,0);
OUTTEXT(INP);
OUTIMAGE;
FOR I := 1 STEP 1 UNTIL RES.TLIST.SIZE DO BEGIN
OUTTEXT(" ");
OUTTEXT(RES.TLIST.GET(I));
OUTIMAGE;
END;
OUTIMAGE;
END;
END