Operator.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Компилятор языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    Copyright © 2021, 2024 Малик Разработчик

    Это свободная программа: вы можете перераспространять ее и/или изменять
    ее на условиях Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она будет полезной,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <https://www.gnu.org/licenses/>.
*/

package ru.malik.elaborarer.avtoo.lang;

import avt.lang.array.*;

public class Operator(Callable, Cloneable, Measureable, ObjectArray, TypedItem, TypedMember, AVTOOConstants)
{
    public static int symbolToKind(String symbol) {
        if(symbol == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "symbol" }));
        }
        if(symbol.equals("[]="))    return WRITE_COMPONENT;
        if(symbol.equals("[]"))     return READ_COMPONENT;
        if(symbol.equals("()"))     return INVOKE_VIRTUAL;
        if(symbol.equals("~"))      return O_BIT_NOT;
        if(symbol.equals("&"))      return O_BIT_AND;
        if(symbol.equals("|"))      return O_BIT_OR;
        if(symbol.equals("^"))      return O_BIT_XOR;
        if(symbol.equals("*"))      return O_SCAL_MUL;
        if(symbol.equals("/"))      return O_SCAL_DIV;
        if(symbol.equals("//"))     return O_SCAL_DIVU;
        if(symbol.equals("%"))      return O_SCAL_REM;
        if(symbol.equals("%%"))     return O_SCAL_REMU;
        if(symbol.equals("+"))      return O_SCAL_ADD;
        if(symbol.equals("-"))      return O_SCAL_SUB;
        if(symbol.equals(">>"))     return O_SCAL_SHR;
        if(symbol.equals(">>>"))    return O_SCAL_SHRU;
        if(symbol.equals("<<"))     return O_SCAL_SHL;
        if(symbol.equals(">"))      return O_SCAL_GT;
        if(symbol.equals(">="))     return O_SCAL_GE;
        if(symbol.equals("<"))      return O_SCAL_LT;
        if(symbol.equals("<="))     return O_SCAL_LE;
        if(symbol.equals("####"))   return O_VECT_LUP;
        if(symbol.equals("^^^^"))   return O_VECT_UUP;
        if(symbol.equals("@@@@"))   return O_VECT_PCK;
        if(symbol.equals("****"))   return O_VECT_MUL;
        if(symbol.equals("////"))   return O_VECT_DIV;
        if(symbol.equals("++++"))   return O_VECT_ADD;
        if(symbol.equals("----"))   return O_VECT_SUB;
        if(symbol.equals(">>>>"))   return O_VECT_SHR;
        if(symbol.equals(">>>>>"))  return O_VECT_SHRU;
        if(symbol.equals("<<<<"))   return O_VECT_SHL;
        if(symbol.equals("|>>|"))   return O_VECT_GT;
        if(symbol.equals("|>=|"))   return O_VECT_GE;
        if(symbol.equals("|<<|"))   return O_VECT_LT;
        if(symbol.equals("|<=|"))   return O_VECT_LE;
        if(symbol.equals("|==|"))   return O_VECT_EQ;
        if(symbol.equals("|!=|"))   return O_VECT_NE;
        if(symbol.equals("|**|"))   return O_VECT_HMUL;
        if(symbol.equals("|++|"))   return O_VECT_SADD;
        if(symbol.equals("|--|"))   return O_VECT_SSUB;
        if(symbol.equals("#**#"))   return O_VECT_HMULU;
        if(symbol.equals("#++#"))   return O_VECT_SADDU;
        if(symbol.equals("#--#"))   return O_VECT_SSUBU;
        if(symbol.equals("&`"))     return R_BIT_AND;
        if(symbol.equals("|`"))     return R_BIT_OR;
        if(symbol.equals("^`"))     return R_BIT_XOR;
        if(symbol.equals("*`"))     return R_SCAL_MUL;
        if(symbol.equals("/`"))     return R_SCAL_DIV;
        if(symbol.equals("//`"))    return R_SCAL_DIVU;
        if(symbol.equals("%`"))     return R_SCAL_REM;
        if(symbol.equals("%%`"))    return R_SCAL_REMU;
        if(symbol.equals("+`"))     return R_SCAL_ADD;
        if(symbol.equals("-`"))     return R_SCAL_SUB;
        if(symbol.equals(">>`"))    return R_SCAL_SHR;
        if(symbol.equals(">>>`"))   return R_SCAL_SHRU;
        if(symbol.equals("<<`"))    return R_SCAL_SHL;
        if(symbol.equals(">`"))     return R_SCAL_GT;
        if(symbol.equals(">=`"))    return R_SCAL_GE;
        if(symbol.equals("<`"))     return R_SCAL_LT;
        if(symbol.equals("<=`"))    return R_SCAL_LE;
        if(symbol.equals("****`"))  return R_VECT_MUL;
        if(symbol.equals("////`"))  return R_VECT_DIV;
        if(symbol.equals("++++`"))  return R_VECT_ADD;
        if(symbol.equals("----`"))  return R_VECT_SUB;
        if(symbol.equals(">>>>`"))  return R_VECT_SHR;
        if(symbol.equals(">>>>>`")) return R_VECT_SHRU;
        if(symbol.equals("<<<<`"))  return R_VECT_SHL;
        if(symbol.equals("|>>|`"))  return R_VECT_GT;
        if(symbol.equals("|>=|`"))  return R_VECT_GE;
        if(symbol.equals("|<<|`"))  return R_VECT_LT;
        if(symbol.equals("|<=|`"))  return R_VECT_LE;
        if(symbol.equals("|==|`"))  return R_VECT_EQ;
        if(symbol.equals("|!=|`"))  return R_VECT_NE;
        if(symbol.equals("|**|`"))  return R_VECT_HMUL;
        if(symbol.equals("|++|`"))  return R_VECT_SADD;
        if(symbol.equals("|--|`"))  return R_VECT_SSUB;
        if(symbol.equals("#**#`"))  return R_VECT_HMULU;
        if(symbol.equals("#++#`"))  return R_VECT_SADDU;
        if(symbol.equals("#--#`"))  return R_VECT_SSUBU;
        throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "symbol" }));
    }

    public static int specialSimpleNameToKind(String name) {
        if(name == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "name" }));
        }
        int length = name.length;
        name = length-- <= 0 || name[0] != '<' || name[length] != '>' ? "" : name.substring(1, length);
        if(name.equals("awr"))    return WRITE_COMPONENT;
        if(name.equals("ard"))    return READ_COMPONENT;
        if(name.equals("inv"))    return INVOKE_VIRTUAL;
        if(name.equals("not"))    return O_BIT_NOT;
        if(name.equals("and"))    return O_BIT_AND;
        if(name.equals("or"))     return O_BIT_OR;
        if(name.equals("xor"))    return O_BIT_XOR;
        if(name.equals("mul"))    return O_SCAL_MUL;
        if(name.equals("div"))    return O_SCAL_DIV;
        if(name.equals("divu"))   return O_SCAL_DIVU;
        if(name.equals("rem"))    return O_SCAL_REM;
        if(name.equals("remu"))   return O_SCAL_REMU;
        if(name.equals("pos"))    return O_SCAL_POS;
        if(name.equals("add"))    return O_SCAL_ADD;
        if(name.equals("neg"))    return O_SCAL_NEG;
        if(name.equals("sub"))    return O_SCAL_SUB;
        if(name.equals("shr"))    return O_SCAL_SHR;
        if(name.equals("shru"))   return O_SCAL_SHRU;
        if(name.equals("shl"))    return O_SCAL_SHL;
        if(name.equals("gt"))     return O_SCAL_GT;
        if(name.equals("ge"))     return O_SCAL_GE;
        if(name.equals("lt"))     return O_SCAL_LT;
        if(name.equals("le"))     return O_SCAL_LE;
        if(name.equals("vlup"))   return O_VECT_LUP;
        if(name.equals("vuup"))   return O_VECT_UUP;
        if(name.equals("vpck"))   return O_VECT_PCK;
        if(name.equals("vmul"))   return O_VECT_MUL;
        if(name.equals("vdiv"))   return O_VECT_DIV;
        if(name.equals("vpos"))   return O_VECT_POS;
        if(name.equals("vadd"))   return O_VECT_ADD;
        if(name.equals("vneg"))   return O_VECT_NEG;
        if(name.equals("vsub"))   return O_VECT_SUB;
        if(name.equals("vshr"))   return O_VECT_SHR;
        if(name.equals("vshru"))  return O_VECT_SHRU;
        if(name.equals("vshl"))   return O_VECT_SHL;
        if(name.equals("vgt"))    return O_VECT_GT;
        if(name.equals("vge"))    return O_VECT_GE;
        if(name.equals("vlt"))    return O_VECT_LT;
        if(name.equals("vle"))    return O_VECT_LE;
        if(name.equals("veq"))    return O_VECT_EQ;
        if(name.equals("vne"))    return O_VECT_NE;
        if(name.equals("hmul"))   return O_VECT_HMUL;
        if(name.equals("sadd"))   return O_VECT_SADD;
        if(name.equals("ssub"))   return O_VECT_SSUB;
        if(name.equals("hmulu"))  return O_VECT_HMULU;
        if(name.equals("saddu"))  return O_VECT_SADDU;
        if(name.equals("ssubu"))  return O_VECT_SSUBU;
        if(name.equals("rand"))   return R_BIT_AND;
        if(name.equals("ror"))    return R_BIT_OR;
        if(name.equals("rxor"))   return R_BIT_XOR;
        if(name.equals("rmul"))   return R_SCAL_MUL;
        if(name.equals("rdiv"))   return R_SCAL_DIV;
        if(name.equals("rdivu"))  return R_SCAL_DIVU;
        if(name.equals("rrem"))   return R_SCAL_REM;
        if(name.equals("rremu"))  return R_SCAL_REMU;
        if(name.equals("radd"))   return R_SCAL_ADD;
        if(name.equals("rsub"))   return R_SCAL_SUB;
        if(name.equals("rshr"))   return R_SCAL_SHR;
        if(name.equals("rshru"))  return R_SCAL_SHRU;
        if(name.equals("rshl"))   return R_SCAL_SHL;
        if(name.equals("rgt"))    return R_SCAL_GT;
        if(name.equals("rge"))    return R_SCAL_GE;
        if(name.equals("rlt"))    return R_SCAL_LT;
        if(name.equals("rle"))    return R_SCAL_LE;
        if(name.equals("rvmul"))  return R_VECT_MUL;
        if(name.equals("rvdiv"))  return R_VECT_DIV;
        if(name.equals("rvadd"))  return R_VECT_ADD;
        if(name.equals("rvsub"))  return R_VECT_SUB;
        if(name.equals("rvshr"))  return R_VECT_SHR;
        if(name.equals("rvshru")) return R_VECT_SHRU;
        if(name.equals("rvshl"))  return R_VECT_SHL;
        if(name.equals("rvgt"))   return R_VECT_GT;
        if(name.equals("rvge"))   return R_VECT_GE;
        if(name.equals("rvlt"))   return R_VECT_LT;
        if(name.equals("rvle"))   return R_VECT_LE;
        if(name.equals("rveq"))   return R_VECT_EQ;
        if(name.equals("rvne"))   return R_VECT_NE;
        if(name.equals("rhmul"))  return R_VECT_HMUL;
        if(name.equals("rsadd"))  return R_VECT_SADD;
        if(name.equals("rssub"))  return R_VECT_SSUB;
        if(name.equals("rhmulu")) return R_VECT_HMULU;
        if(name.equals("rsaddu")) return R_VECT_SADDU;
        if(name.equals("rssubu")) return R_VECT_SSUBU;
        throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "name" }));
    }

    public static String kindToSymbol(int kind) {
        switch(kind)
        {
        case WRITE_COMPONENT: return "[]=";
        case READ_COMPONENT : return "[]";
        case INVOKE_VIRTUAL : return "()";
        case O_BIT_NOT      : return "~";
        case O_BIT_AND      : return "&";
        case O_BIT_OR       : return "|";
        case O_BIT_XOR      : return "^";
        case O_SCAL_MUL     : return "*";
        case O_SCAL_DIV     : return "/";
        case O_SCAL_DIVU    : return "//";
        case O_SCAL_REM     : return "%";
        case O_SCAL_REMU    : return "%%";
        case O_SCAL_POS     :
        case O_SCAL_ADD     : return "+";
        case O_SCAL_NEG     :
        case O_SCAL_SUB     : return "-";
        case O_SCAL_SHR     : return ">>";
        case O_SCAL_SHRU    : return ">>>";
        case O_SCAL_SHL     : return "<<";
        case O_SCAL_GT      : return ">";
        case O_SCAL_GE      : return ">=";
        case O_SCAL_LT      : return "<";
        case O_SCAL_LE      : return "<=";
        case O_VECT_LUP     : return "####";
        case O_VECT_UUP     : return "^^^^";
        case O_VECT_PCK     : return "@@@@";
        case O_VECT_MUL     : return "****";
        case O_VECT_DIV     : return "////";
        case O_VECT_POS     :
        case O_VECT_ADD     : return "++++";
        case O_VECT_NEG     :
        case O_VECT_SUB     : return "----";
        case O_VECT_SHR     : return ">>>>";
        case O_VECT_SHRU    : return ">>>>>";
        case O_VECT_SHL     : return "<<<<";
        case O_VECT_GT      : return "|>>|";
        case O_VECT_GE      : return "|>=|";
        case O_VECT_LT      : return "|<<|";
        case O_VECT_LE      : return "|<=|";
        case O_VECT_EQ      : return "|==|";
        case O_VECT_NE      : return "|!=|";
        case O_VECT_HMUL    : return "|**|";
        case O_VECT_SADD    : return "|++|";
        case O_VECT_SSUB    : return "|--|";
        case O_VECT_HMULU   : return "#**#";
        case O_VECT_SADDU   : return "#++#";
        case O_VECT_SSUBU   : return "#--#";
        case R_BIT_AND      : return "&`";
        case R_BIT_OR       : return "|`";
        case R_BIT_XOR      : return "^`";
        case R_SCAL_MUL     : return "*`";
        case R_SCAL_DIV     : return "/`";
        case R_SCAL_DIVU    : return "//`";
        case R_SCAL_REM     : return "%`";
        case R_SCAL_REMU    : return "%%`";
        case R_SCAL_ADD     : return "+`";
        case R_SCAL_SUB     : return "-`";
        case R_SCAL_SHR     : return ">>`";
        case R_SCAL_SHRU    : return ">>>`";
        case R_SCAL_SHL     : return "<<`";
        case R_SCAL_GT      : return ">`";
        case R_SCAL_GE      : return ">=`";
        case R_SCAL_LT      : return "<`";
        case R_SCAL_LE      : return "<=`";
        case R_VECT_MUL     : return "****`";
        case R_VECT_DIV     : return "////`";
        case R_VECT_ADD     : return "++++`";
        case R_VECT_SUB     : return "----`";
        case R_VECT_SHR     : return ">>>>`";
        case R_VECT_SHRU    : return ">>>>>`";
        case R_VECT_SHL     : return "<<<<`";
        case R_VECT_GT      : return "|>>|`";
        case R_VECT_GE      : return "|>=|`";
        case R_VECT_LT      : return "|<<|`";
        case R_VECT_LE      : return "|<=|`";
        case R_VECT_EQ      : return "|==|`";
        case R_VECT_NE      : return "|!=|`";
        case R_VECT_HMUL    : return "|**|`";
        case R_VECT_SADD    : return "|++|`";
        case R_VECT_SSUB    : return "|--|`";
        case R_VECT_HMULU   : return "#**#`";
        case R_VECT_SADDU   : return "#++#`";
        case R_VECT_SSUBU   : return "#--#`";
        }
        throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "kind" }));
    }

    public static String kindToSpecialSimpleName(int kind) {
        String name = kindToInternalName(kind);
        int length = name.length;
        char[] result = new char[length + 2];
        result[0] = '<';
        result[length + 1] = '>';
        name.getChars(0, length, result, 1);
        return (new String(result)).intern();
    }

    private static String kindToInternalName(int kind) {
        switch(kind)
        {
        case WRITE_COMPONENT: return "awr";
        case READ_COMPONENT : return "ard";
        case INVOKE_VIRTUAL : return "inv";
        case O_BIT_NOT      : return "not";
        case O_BIT_AND      : return "and";
        case O_BIT_OR       : return "or";
        case O_BIT_XOR      : return "xor";
        case O_SCAL_MUL     : return "mul";
        case O_SCAL_DIV     : return "div";
        case O_SCAL_DIVU    : return "divu";
        case O_SCAL_REM     : return "rem";
        case O_SCAL_REMU    : return "remu";
        case O_SCAL_POS     : return "pos";
        case O_SCAL_ADD     : return "add";
        case O_SCAL_NEG     : return "neg";
        case O_SCAL_SUB     : return "sub";
        case O_SCAL_SHR     : return "shr";
        case O_SCAL_SHRU    : return "shru";
        case O_SCAL_SHL     : return "shl";
        case O_SCAL_GT      : return "gt";
        case O_SCAL_GE      : return "ge";
        case O_SCAL_LT      : return "lt";
        case O_SCAL_LE      : return "le";
        case O_VECT_LUP     : return "vlup";
        case O_VECT_UUP     : return "vuup";
        case O_VECT_PCK     : return "vpck";
        case O_VECT_MUL     : return "vmul";
        case O_VECT_DIV     : return "vdiv";
        case O_VECT_POS     : return "vpos";
        case O_VECT_ADD     : return "vadd";
        case O_VECT_NEG     : return "vneg";
        case O_VECT_SUB     : return "vsub";
        case O_VECT_SHR     : return "vshr";
        case O_VECT_SHRU    : return "vshru";
        case O_VECT_SHL     : return "vshl";
        case O_VECT_GT      : return "vgt";
        case O_VECT_GE      : return "vge";
        case O_VECT_LT      : return "vlt";
        case O_VECT_LE      : return "vle";
        case O_VECT_EQ      : return "veq";
        case O_VECT_NE      : return "vne";
        case O_VECT_HMUL    : return "hmul";
        case O_VECT_SADD    : return "sadd";
        case O_VECT_SSUB    : return "ssub";
        case O_VECT_HMULU   : return "hmulu";
        case O_VECT_SADDU   : return "saddu";
        case O_VECT_SSUBU   : return "ssubu";
        case R_BIT_AND      : return "rand";
        case R_BIT_OR       : return "ror";
        case R_BIT_XOR      : return "rxor";
        case R_SCAL_MUL     : return "rmul";
        case R_SCAL_DIV     : return "rdiv";
        case R_SCAL_DIVU    : return "rdivu";
        case R_SCAL_REM     : return "rrem";
        case R_SCAL_REMU    : return "rremu";
        case R_SCAL_ADD     : return "radd";
        case R_SCAL_SUB     : return "rsub";
        case R_SCAL_SHR     : return "rshr";
        case R_SCAL_SHRU    : return "rshru";
        case R_SCAL_SHL     : return "rshl";
        case R_SCAL_GT      : return "rgt";
        case R_SCAL_GE      : return "rge";
        case R_SCAL_LT      : return "rlt";
        case R_SCAL_LE      : return "rle";
        case R_VECT_MUL     : return "rvmul";
        case R_VECT_DIV     : return "rvdiv";
        case R_VECT_ADD     : return "rvadd";
        case R_VECT_SUB     : return "rvsub";
        case R_VECT_SHR     : return "rvshr";
        case R_VECT_SHRU    : return "rvshru";
        case R_VECT_SHL     : return "rvshl";
        case R_VECT_GT      : return "rvgt";
        case R_VECT_GE      : return "rvge";
        case R_VECT_LT      : return "rvlt";
        case R_VECT_LE      : return "rvle";
        case R_VECT_EQ      : return "rveq";
        case R_VECT_NE      : return "rvne";
        case R_VECT_HMUL    : return "rhmul";
        case R_VECT_SADD    : return "rsadd";
        case R_VECT_SSUB    : return "rssub";
        case R_VECT_HMULU   : return "rhmulu";
        case R_VECT_SADDU   : return "rsaddu";
        case R_VECT_SSUBU   : return "rssubu";
        }
        throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "kind" }));
    }

    private final int fldKind;
    private final String fldSymbol;

    public (ClassType parentType, int attributes, Type type, int kind, Local[] arguments, int declarationPosition, int documentationPosition):
        super(parentType, attributes, type, kindToSpecialSimpleName(kind), arguments, declarationPosition, documentationPosition) {
        fldKind = kind;
        fldSymbol = kindToSymbol(kind);
    }

    public String toString() {
        ClassType enclosing = parentType;
        StringBuilder result = new StringBuilder();
        if(enclosing != null) result + enclosing.specialCanonicalName + '.';
        return (result + VIEWNAME_OPERATOR + fldSymbol + arguments).toString();
    }

    public final int kind { read = fldKind }

    public final String symbol { read = fldSymbol }

    protected String composeFasmSimpleName() { return (new StringBuilder() + '$' + kindToInternalName(fldKind) + '$').toString(); }
}