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; 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(new If(deRoundBracket(getCodeToken(tok, 1)), parseProcedure(joinSubList(tok, 3*2)), null)); } else if (eqic(firstCodeToken(tok), "while")) { assertEquals(s, ":", getCodeToken(tok, 2)); out.add(new While(deRoundBracket(getCodeToken(tok, 1)), parseProcedure(joinSubList(tok, 3*2)))); } else if (eqic(firstCodeToken(tok), "else")) { O last = last(out); if (!last instanceof If) fail("Else without if"); assertEquals(s, ":", getCodeToken(tok, 1)); ((If) last).elseBlock = joinSubList(tok, 2*2); } else 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, parseProcedure(joinSubList(tok, 3*2)))); } else out.add(s); } //pnl("Parsed procedure ", out); ret out; }