string parseTernary(string s) { if (s.length() <= 1) return s; int level = 0; char c = s[0]; for (int i = 1; i < s.length(); i++) { if (s[i] == '?') level++; else if (s[i] == ':') { if (--level == 0) return c == 'T' ? parseTernary(s.substr(2, i-2)) : parseTernary(s.substr(i+1)); } } return ""; }
Expression* parseTernary(TokenStream* tokens, FileContext* fileContext) { Expression* expression = parseInequality(tokens, fileContext); if (tokens->safePeekValue() == "?") { Token questionToken = tokens->pop(); Expression* trueExpression = parseTernary(tokens, fileContext); tokens->popExpected(":"); Expression* falseExpression = parseTernary(tokens, fileContext); expression = new Ternary(expression, questionToken, trueExpression, falseExpression, fileContext); } return expression; }
string parseTernary(string expression) { // start coding at 10:40 int que = 0; while (que < expression.size() && expression[que] != '?') que += 1; if (que == expression.size()) return expression; int col = que+1; int qCount = 0; while (expression[col] != ':' || qCount) { if (expression[col] == '?') qCount += 1; if (expression[col] == ':') qCount -= 1; col += 1; } if (expression[0] == 'T') return parseTernary(expression.substr(que+1, col-que-1)); else return parseTernary(expression.substr(col+1, expression.size()-col-1)); }
// This function doesn't do anything special, but it's easier to call this instead // of remembering that parseTernary is the outermost of the order of operations. Expression* parseExpression(TokenStream* tokens, FileContext* fileContext) { return parseTernary(tokens, fileContext); }