GXATSNode scanner()

in GaiaXHarmony/GaiaXAnalyze/GXAnalyzeCore/GXWordAnalyze.cpp [81:410]


GXATSNode scanner(int &syn, int &p, char s[], void *p_analyze) {
    GXAnalyze *analyze = (GXAnalyze *) p_analyze;
    int lengthC = strlen(s);
    char *token = new char[lengthC + 1];
    string sign;
    int count = 0;
    bool err = false;
    if (s[p] == ' ')
        p++;
    //VALUE
    if (s[p] == '$') {
        if (s[p + 1] == '$') {
            //ALL DATA
            token[count++] = s[p];
            p++;
            token[count++] = s[p];
            p++;
            token[count] = '\0'; //'\0'作为结束符 ,将单词分隔开
            syn = 13;
            sign = "data";
        } else {
            //VALUE
            p++;
            while (isNum(s[p]) || isChar(s[p]) || s[p] == '[' || s[p] == ']' || s[p] == '.') {
                token[count++] = s[p];
                p++;
            }
            token[count] = '\0'; //'\0'作为结束符 ,将单词分隔开
            syn = 10;            //value
            sign = "value";
        }
    }
        //ID OR 特定关键字
    else if (isChar(s[p])) {
        while (isNum(s[p]) || isChar(s[p])) {
            token[count++] = s[p];
            p++;
        }
        token[count] = '\0'; //'\0'作为结束符 ,将单词分隔开
        syn = isKey(token);  //特定类型
        //ID
        if (syn == -1) {
            syn = 14; //ID
            sign = "id";
            if (s[p] == '(' && s[p + 1] == ')') {
                sign = "function";
                syn = 36;
                p = p + 2;
            }
        }
            //TOKEN关键字
        else {
            string temp = token;
            if (temp == "true" || temp == "false") {
                sign = "bool";
            } else {
                sign = "null";
            }
        }
    }
        //NUM
    else if (isNum(s[p])) {
        bool hasPoint = false;
        while (isNum(s[p]) || s[p] == '.' || isChar(s[p])) {
            if (isChar(s[p])) {
                //error 数字后面接字母
                err = true;
                token[count++] = s[p];
                p++;
            } else if (s[p] == '.') {
                if (!hasPoint) {
                    hasPoint = true;
                    token[count++] = s[p];
                    p++;
                    if (!isNum(s[p])) {
                        //error 小数点后不接数值
                        err = true;
                    }
                } else {
                    //error 拥有多于一个.
                    err = true;
                    token[count++] = s[p];
                    p++;
                }
            } else {
                token[count++] = s[p];
                p++;
            }
        }
        if(hasPoint){
            syn = 11; //数字digit(digit) *
            sign = "num";
        }else{
            syn = 37;
            sign = "long";
        }
        if (err) {
            syn = 0;
            sign = "error";
            string errorMsg = token;
            analyze->throwError("unknown identifier: " + errorMsg);
        }
        token[count] = '\0'; //结束标识
    }
        //STRING
    else if (s[p] == '\'') {
        p++;
        while (s[p] != '\'' && s[p] != '\0') {
            token[count++] = s[p];
            p++;
        }
        if (s[p] == '\0') {
            err = true;
        }
        syn = 12;
        sign = "string";
        if (err) {
            sign = "error";
            syn = 0;
            string errorMsg = token;
            analyze->throwError("unknown identifier: " + errorMsg);
        }
        token[count] = '\0'; //结束标识
        p++;
    }
        //如果是运算符或者界符
    else {
        //先处理没有争议的字符
        switch (s[p]) {
            case ',':
                syn = 15;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case '(':
                syn = 16;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case ')':
                syn = 17;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case '-':
                syn = 19;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case '+':
                syn = 20;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case '%':
                syn = 21;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case '/':
                syn = 22;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case '*':
                syn = 23;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case ':':
                syn = 33;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "op";
                break;
            case '#':
                syn = 35;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "null";
                break;
            case '~':
                syn = 36;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "null";
                break;
            case '?': {
                token[count++] = s[p];
                if (s[p + 1] == ':') {
                    p++;
                    token[count++] = s[p];
                    syn = 34;
                    sign = "op";
                } else {
                    syn = 32;
                    sign = "op";
                }
                token[count] = '\0';
                break;
            }
                //< <=
            case '<': {
                token[count++] = s[p];
                if (s[p + 1] == '=') {
                    p++;
                    token[count++] = s[p];
                    syn = 27;
                    sign = "op";
                } else {
                    syn = 25;
                    sign = "op";
                }
                token[count] = '\0';
                break;
            }
                //> >=
            case '>': {
                token[count++] = s[p];
                if (s[p + 1] == '=') {
                    p++;
                    token[count++] = s[p];
                    syn = 26;
                    sign = "op";
                } else {
                    syn = 24;
                    sign = "op";
                }
                token[count] = '\0';
                break;
            }
                //&&
            case '&': {
                token[count++] = s[p];
                if (s[p + 1] == '&') {
                    p++;
                    token[count++] = s[p];
                    syn = 30;
                    sign = "op";
                } else {
                    syn = 0;
                    sign = "op";
                }
                token[count] = '\0';
                break;
            }
                //||
            case '|': {
                token[count++] = s[p];
                if (s[p + 1] == '|') {
                    p++;
                    token[count++] = s[p];
                    syn = 31;
                    sign = "op";
                } else {
                    syn = 0;
                    p++;
                    token[count++] = s[p];
                    sign = "error";
                    string errorMsg = token;
                    analyze->throwError("unknown identifier: " + errorMsg);
                }
                token[count] = '\0';
                break;
            }
                //!=
            case '!': {
                token[count++] = s[p];
                if (s[p + 1] == '=') {
                    p++;
                    token[count++] = s[p];
                    syn = 29;
                    sign = "op";
                } else {
                    syn = 18;
                    sign = "op";
                }
                token[count] = '\0';
                break;
            }
                //==
            case '=': {
                token[count++] = s[p];
                if (s[p + 1] == '=') {
                    p++;
                    token[count++] = s[p];
                    syn = 28;
                    sign = "op";
                } else {
                    syn = 0;
                    sign = "error";
                    p++;
                    token[count++] = s[p];
                    string errorMsg = token;
                    analyze->throwError("unknown identifier: " + errorMsg);
                }
                token[count] = '\0';
                break;
            }
            default: {
                syn = 0;
                token[count++] = s[p];
                token[count] = '\0';
                sign = "error";
                string errorMsg = token;
                analyze->throwError("unknown identifier: " + errorMsg);
                break;
            }
        }
        //后移
        p++; //判断运算符和界符的这部分由于指针 p 没有向后指,所以需要将指针 p 向后移一位
    }
    string str1 = token;
    GXATSNode temp;
    if (sign == "bool" || sign == "op") {
        temp = GXATSNode(str1, str1, sign);
    } else {
        temp = GXATSNode(str1, sign, sign);
    }
    delete[]token;
    return temp;
}