1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package Torello.CSS;

import java.util.Vector;

/**
 * This class may be instantiated by <B STYLE='color: red;'><I>both</I></B> the Tokenizer
 * <B STYLE='color: red;'><I>and </I></B> the individual Static-Build Methods offered by each of
 * the individual Token-Classes.  This class is used to relay that a Parse-Error has occred during
 * part of the Tokenization Process.
 */
public class TokenizeError
{
    /**
     * The last known location within the input Code-Point {@code int[]}-Array where a valid
     * {@link CSSToken} instance was generated before the Parse-Error Occured.
     */
    public final int sPos;
    
    /**
     * The exact location of the input Code-Point {@code int[]}-Array that was being analyzed when
     * it was ultimately decided that a Parse-Error had unequivocally occured.
     */
    public final int ePos;

    /**
     * The {@link CSSToken} class whose {@code 'consume'} method was being executed which uncovered
     * this {@code TokenizeError}.  Specifically, if the Class {@link Str} Method
     * {@link Str#consume 'consume'} was running when the error was found then this {@code public}
     * constant field would be assigned {@code Str.class}.
     */
    public final Class<? extends CSSToken> parsingClass;

    /** The CSS where the error occured. {@code subStr = new String(css, sPos, ePos-sPos); } */
    public final String subStr;

    /**
     * The Tokenizer's various {@code 'cosnume'} methods will attempt to provide a thoughtfully 
     * worded Error-Message depicting what has gone wrong.  Those message's {@code String}-text
     * content will be saved to this {@code public} field.
     */
    public final String message;

    <T extends CSSToken> TokenizeError(
            final int[]                     css,
            final int                       sPos,
            final int                       ePos,
            final Class<? extends CSSToken> parsingClass,
            final String                    message
        )
    {
        this.sPos           = sPos;
        this.ePos           = ePos;
        this.subStr         = new String(css, sPos, ePos-sPos);
        this.parsingClass   = parsingClass;
        this.message        = message;
    }

    void throwException()
    { throw new TokenizeException(toString()); }

    public String toString()
    {
        return
            "Class:          [" + parsingClass.getSimpleName() + "] Build/Parse\n" +
            "Input CSS-Text: [" + subStr + "]\n" +
            "Message:\n\t" + message;
    }
}