bool parsePythonesqueProcedure_debug; L parsePythonesqueProcedure(S proc) { //printStruct(proc); proc = withoutLinesEmptyAfterTrim(proc); //printStruct(proc); //proc = autoUnindent(proc); proc = autoUnindent_honoringBrackets(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), "unless")) { assertEquals(s, ":", getCodeToken(tok, 2)); out.add(lastIf = new If(deRoundBracket(getCodeToken(tok, 1)), null, parsePythonesqueProcedure(joinSubList(tok, 3*2)))); 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)); lastIf.elseBlock = lastIf = new If(deRoundBracket(getCodeToken(tok, 2)), parsePythonesqueProcedure(joinSubList(tok, 4*2)), null); continue; } if (eqic(firstCodeToken(tok), "else")) { O last = last(out); if (lastIf == null) fail("Else without if"); assertEquals(s, ":", getCodeToken(tok, 1)); lastIf.elseBlock = joinSubList(tok, 2*2); continue; } // assignment if (eqGet(tok, 3, ":") && eqGet(tok, 5, "=")) { out.add(new Assignment(get(tok, 1), joinSubList(tok, 7))); continue; } lastIf = null; if (eqic(firstCodeToken(tok), "for")) { if (eq(getCodeToken(tok, 2), "in")) { int idx = indexOf(tok, ":"); assertTrue(s, idx >= 0); S var = getCodeToken(tok, 1); S expr = joinSubList(tok, 3*2+1, idx-1); O body = parsePythonesqueProcedure(joinSubList(tok, idx+1)); out.add(new ForIn(var, expr, body)); } else { 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); } if (parsePythonesqueProcedure_debug) pnl("Parsed procedure ", out); ret out; }