in tapestry-framework/src/org/apache/tapestry/script/AbstractTokenRule.java [65:180]
    protected void addTextTokens(IScriptToken token, String text, ILocation location)
    {
        char[] buffer = text.toCharArray();
        int state = STATE_START;
        int blockStart = 0;
        int blockLength = 0;
        int expressionStart = -1;
        int expressionLength = 0;
        int i = 0;
        int braceDepth = 0;
        while (i < buffer.length)
        {
            char ch = buffer[i];
            switch (state)
            {
                case STATE_START :
                    if (ch == '$')
                    {
                        state = STATE_DOLLAR;
                        i++;
                        continue;
                    }
                    blockLength++;
                    i++;
                    continue;
                case STATE_DOLLAR :
                    if (ch == '{')
                    {
                        state = STATE_COLLECT_EXPRESSION;
                        i++;
                        expressionStart = i;
                        expressionLength = 0;
                        braceDepth = 1;
                        continue;
                    }
                    // The '$' was just what it was, not the start of a ${} expression
                    // block, so include it as part of the static text block.
                    blockLength++;
                    state = STATE_START;
                    continue;
                case STATE_COLLECT_EXPRESSION :
                    if (ch != '}')
                    {
                        if (ch == '{')
                            braceDepth++;
                        i++;
                        expressionLength++;
                        continue;
                    }
                    braceDepth--;
                    if (braceDepth > 0)
                    {
                        i++;
                        expressionLength++;
                        continue;
                    }
                    // Hit the closing brace of an expression.
                    // Degenerate case:  the string "${}".
                    if (expressionLength == 0)
                        blockLength += 3;
                    if (blockLength > 0)
                        token.addToken(constructStatic(text, blockStart, blockLength, location));
                    if (expressionLength > 0)
                    {
                        String expression =
                            text.substring(expressionStart, expressionStart + expressionLength);
                        token.addToken(new InsertToken(expression, location));
                    }
                    i++;
                    blockStart = i;
                    blockLength = 0;
                    // And drop into state start
                    state = STATE_START;
                    continue;
            }
        }
        // OK, to handle the end.  Couple of degenerate cases where
        // a ${...} was incomplete, so we adust the block length.
        if (state == STATE_DOLLAR)
            blockLength++;
        if (state == STATE_COLLECT_EXPRESSION)
            blockLength += expressionLength + 2;
        if (blockLength > 0)
            token.addToken(constructStatic(text, blockStart, blockLength, location));
    }