/*
Компилятор языка программирования
Объектно-ориентированный продвинутый векторный транслятор
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(); }
}