L parsePythonesqueProcedure(S proc) { //printStruct(proc); proc = withoutLinesEmptyAfterTrim(proc); //printStruct(proc); proc = autoUnindent(proc); //printStruct(proc); //print(indentx("> ", proc)); LS l = groupPythonStyleIndents_honoringBrackets(proc); //pnl("unpythonized ", l); new L out; If lastIf = null; for i over l: { S s = l.get(i); LS tok = javaTokWithBrackets(s); if (eqic(firstCodeToken(tok), "if")) { assertEquals(s, ":", getCodeToken(tok, 2)); out.add(lastIf = new If(deRoundBracket(getCodeToken(tok, 1)), parsePythonesqueProcedure(joinSubList(tok, 3*2)), null)); continue; } if (eqic(firstCodeToken(tok), "while")) { assertEquals(s, ":", getCodeToken(tok, 2)); out.add(new While(deRoundBracket(getCodeToken(tok, 1)), parsePythonesqueProcedure(joinSubList(tok, 3*2)))); continue; } if (eqic(firstCodeToken(tok), "else") && eqic(secondCodeToken(tok), "if")) { O last = last(out); if (lastIf == null) fail("Else if without if"); assertEquals(s, ":", getCodeToken(tok, 3)); ((If) last).elseBlock = lastIf = new If(deRoundBracket(getCodeToken(tok, 2)), parsePythonesqueProcedure(joinSubList(tok, 4*2)), null); } else if (eqic(firstCodeToken(tok), "else")) { O last = last(out); if (lastIf == null) fail("Else without if"); assertEquals(s, ":", getCodeToken(tok, 1)); ((If) last).elseBlock = joinSubList(tok, 2*2); continue; } lastIf = null; if (eqic(firstCodeToken(tok), "for")) { assertEquals(s, ":", getCodeToken(tok, 2)); S cond = getCodeToken(tok, 1); // cond looks like: "(y | x has a y)" cond = deRoundBracket(cond); LS tok2 = javaTok(cond); assertEquals(cond, "|", getCodeToken(tok2, 1)); S var = assertIdentifier(cond, getCodeToken(tok2, 0)); S actualCondition = trimJoinSubList(tok2, 2*2+1); out.add(new For(var, actualCondition, parsePythonesqueProcedure(joinSubList(tok, 3*2)))); } else out.add(s); } //pnl("Parsed procedure ", out); ret out; }