OpenSimMirror/OpenSim/Region/ScriptEngine/YEngine/MMRScriptTokenize.cs

2973 lines
122 KiB
C#
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @brief Parse raw source file string into token list.
*
* Usage:
*
* emsg = some function to output error messages to
* source = string containing entire source file
*
* TokenBegin tokenBegin = TokenBegin.Construct (emsg, source);
*
* tokenBegin = null: tokenizing error
* else: first (dummy) token in file
* the rest are chained by nextToken,prevToken
* final token is always a (dummy) TokenEnd
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
using LSL_Key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
using LSL_Rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
namespace OpenSim.Region.ScriptEngine.Yengine
{
public delegate void TokenErrorMessage(Token token, string message);
/**
* @brief base class for all tokens
*/
public class Token
{
public static readonly int MAX_NAME_LEN = 255;
public static readonly int MAX_STRING_LEN = 4096;
public Token nextToken;
public Token prevToken;
public bool nr2l;
// used for error message printing
public TokenErrorMessage emsg;
public string file = "";
public int line;
public int posn;
public Token copiedFrom;
/**
* @brief construct a token coming directly from a source file
* @param emsg = object that error messages get sent to
* @param file = source file name (or "" if none)
* @param line = source file line number
* @param posn = token's position within that source line
*/
public Token(TokenErrorMessage emsg, string file, int line, int posn)
{
this.emsg = emsg;
this.file = file;
this.line = line;
this.posn = posn;
}
/**
* @brief construct a token with same error message parameters
* @param original = original token to create from
*/
public Token(Token original)
{
if(original != null)
{
this.emsg = original.emsg;
this.file = original.file;
this.line = original.line;
this.posn = original.posn;
this.nr2l = original.nr2l;
}
}
/**
* @brief output an error message associated with this token
* sends the message to the token's error object
* @param message = error message string
*/
public void ErrorMsg(string message)
{
if(emsg != null)
{
emsg(this, message);
}
}
/*
* Generate a unique string (for use in CIL label names, etc)
*/
public string Unique
{
get
{
return file + "_" + line + "_" + posn;
}
}
/*
* Generate source location string (for use in error messages)
*/
public string SrcLoc
{
get
{
string loc = file + "(" + line + "," + posn + ")";
if(copiedFrom == null)
return loc;
string fromLoc = copiedFrom.SrcLoc;
if(fromLoc.StartsWith(loc))
return fromLoc;
return loc + ":" + fromLoc;
}
}
/*
* Used in generic instantiation to copy token.
* Only valid for parsing tokens, not reduction tokens
* because it is a shallow copy.
*/
public Token CopyToken(Token src)
{
Token t = (Token)this.MemberwiseClone();
t.file = src.file;
t.line = src.line;
t.posn = src.posn;
t.copiedFrom = this;
return t;
}
/*
* Generate debugging string - should look like source code.
*/
public virtual void DebString(StringBuilder sb)
{
sb.Append(this.ToString());
}
}
/**
* @brief token that begins a source file
* Along with TokenEnd, it keeps insertion/removal of intermediate tokens
* simple as the intermediate tokens always have non-null nextToken,prevToken.
*/
public class TokenBegin: Token
{
private class Options
{
public bool arrays; // has seen 'XMROption arrays;'
public bool advFlowCtl; // has seen 'XMROption advFlowCtl;'
public bool tryCatch; // has seen 'XMROption tryCatch;'
public bool objects; // has seen 'XMROption objects;'
public bool chars; // has seen 'XMROption chars;'
public bool noRightToLeft; // has seen 'XMROption noRightToLeft;'
public bool dollarsigns; // has seen 'XMROption dollarsigns;'
}
private bool youveAnError; // there was some error tokenizing
private int bolIdx; // index in 'source' at begining of current line
private int lineNo; // current line in source file, starting at 0
private string filNam; // current source file name
private string source; // the whole script source code
private Token lastToken; // last token created so far
private string cameFrom; // where the source came from
private TextWriter saveSource; // save copy of source here (or null)
private Options options = new Options();
/**
* @brief convert a source file in the form of a string
* to a list of raw tokens
* @param cameFrom = where the source came from
* @param emsg = where to output messages to
* @param source = whole source file contents
* @returns null: conversion error, message already output
* else: list of tokens, starting with TokenBegin, ending with TokenEnd.
*/
public static TokenBegin Construct(string cameFrom, TextWriter saveSource, TokenErrorMessage emsg, string source, out string sourceHash)
{
sourceHash = null;
/*
* Now do the tokenization.
*/
TokenBegin tokenBegin = new TokenBegin(emsg, "", 0, 0);
tokenBegin.cameFrom = cameFrom;
tokenBegin.saveSource = saveSource;
tokenBegin.lastToken = tokenBegin;
tokenBegin.source = source;
tokenBegin.filNam = cameFrom;
if(saveSource != null)
saveSource.WriteLine(source);
tokenBegin.Tokenize();
if(tokenBegin.youveAnError)
return null;
tokenBegin.AppendToken(new TokenEnd(emsg, tokenBegin.filNam, ++tokenBegin.lineNo, 0));
/*
* Return source hash so caller can know if source changes.
*/
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] hashBytes = md5.ComputeHash(new TokenStream(tokenBegin));
int hashBytesLen = hashBytes.Length;
StringBuilder sb = new StringBuilder(hashBytesLen * 2);
for(int i = 0; i < hashBytesLen; i++)
{
sb.Append(hashBytes[i].ToString("X2"));
}
sourceHash = sb.ToString();
if(saveSource != null)
{
saveSource.WriteLine(" ");
saveSource.WriteLine("********************************************************************************");
saveSource.WriteLine("**** source hash: " + sourceHash);
saveSource.WriteLine("********************************************************************************");
}
return tokenBegin;
}
private TokenBegin(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
/*
* Stream consisting of all the tokens.
* Null delimeters between the tokens.
* Used for creating the source hash.
*/
private class TokenStream: Stream
{
private Token curTok;
private bool delim;
private byte[] curBuf;
private int curOfs;
private int curLen;
public TokenStream(Token t)
{
curTok = t;
}
public override bool CanRead
{
get
{
return true;
}
}
public override bool CanSeek
{
get
{
return false;
}
}
public override bool CanWrite
{
get
{
return false;
}
}
public override long Length
{
get
{
return 0;
}
}
public override long Position
{
get
{
return 0;
}
set
{
}
}
public override void Write(byte[] buffer, int offset, int count)
{
}
public override void Flush()
{
}
public override long Seek(long offset, SeekOrigin origin)
{
return 0;
}
public override void SetLength(long value)
{
}
public override int Read(byte[] buffer, int offset, int count)
{
int len, total;
for(total = 0; total < count; total += len)
{
while((len = curLen - curOfs) <= 0)
{
if(curTok is TokenEnd)
goto done;
curTok = curTok.nextToken;
if(curTok is TokenEnd)
goto done;
curBuf = System.Text.Encoding.UTF8.GetBytes(curTok.ToString());
curOfs = 0;
curLen = curBuf.Length;
delim = true;
}
if(delim)
{
buffer[offset + total] = 0;
delim = false;
len = 1;
}
else
{
if(len > count - total)
len = count - total;
Array.Copy(curBuf, curOfs, buffer, offset + total, len);
curOfs += len;
}
}
done:
return total;
}
}
/*
* Produces raw token stream: names, numbers, strings, keywords/delimeters.
* @param this.source = whole source file in one string
* @returns this.nextToken = filled in with tokens
* this.youveAnError = true: some tokenizing error
* false: successful
*/
private void Tokenize()
{
bolIdx = 0;
lineNo = 0;
for(int i = 0; i < source.Length; i++)
{
char c = source[i];
if(c == '\n')
{
/*
* Increment source line number and set char index of beg of next line.
*/
lineNo++;
bolIdx = i + 1;
/*
* Check for '#' lineno filename newline
* lineno is line number of next line in file
* If found, save values and remove tokens from stream
*/
if((lastToken is TokenStr) &&
(lastToken.prevToken is TokenInt) &&
(lastToken.prevToken.prevToken is TokenKwHash))
{
filNam = ((TokenStr)lastToken).val;
lineNo = ((TokenInt)lastToken.prevToken).val;
lastToken = lastToken.prevToken.prevToken.prevToken;
lastToken.nextToken = null;
}
continue;
}
/*
* Skip over whitespace.
*/
if(c <= ' ')
continue;
/*
* Skip over comments.
*/
if((i + 2 <= source.Length) && source.Substring(i, 2).Equals("//"))
{
while((i < source.Length) && (source[i] != '\n'))
i++;
lineNo++;
bolIdx = i + 1;
continue;
}
if((i + 2 <= source.Length) && (source.Substring(i, 2).Equals("/*")))
{
i += 2;
while((i + 1 < source.Length) && (((c = source[i]) != '*') || (source[i + 1] != '/')))
{
if(c == '\n')
{
lineNo++;
bolIdx = i + 1;
}
i++;
}
i++;
continue;
}
/*
* Check for numbers.
*/
if((c >= '0') && (c <= '9'))
{
int j = TryParseFloat(i);
if(j == 0)
j = TryParseInt(i);
i = --j;
continue;
}
if((c == '.') && (i + 1 < source.Length) && (source[i + 1] >= '0') && (source[i + 1] <= '9'))
{
int j = TryParseFloat(i);
if(j > 0)
i = --j;
continue;
}
/*
* Check for quoted strings.
*/
if(c == '"')
{
StringBuilder sb = new StringBuilder();
bool backslash;
int j;
backslash = false;
for(j = i; ++j < source.Length;)
{
c = source[j];
if(c == '\\' && !backslash)
{
backslash = true;
continue;
}
if(c == '\n')
{
lineNo++;
bolIdx = j + 1;
}
else
{
if(!backslash && (c == '"'))
break;
if(backslash && (c == 'n'))
c = '\n';
if(backslash && (c == 't'))
{
sb.Append(" ");
c = ' ';
}
}
backslash = false;
sb.Append(c);
}
if(j - i > MAX_STRING_LEN)
{
TokenError(i, "string too long, max " + MAX_STRING_LEN);
}
else
{
AppendToken(new TokenStr(emsg, filNam, lineNo, i - bolIdx, sb.ToString()));
}
i = j;
continue;
}
/*
* Check for quoted characters.
*/
if(c == '\'')
{
char cb = (char)0;
bool backslash, overflow, underflow;
int j;
backslash = false;
overflow = false;
underflow = true;
for(j = i; ++j < source.Length;)
{
c = source[j];
if(c == '\\' && !backslash)
{
backslash = true;
continue;
}
if(c == '\n')
{
lineNo++;
bolIdx = j + 1;
}
else
{
if(!backslash && (c == '\''))
break;
if(backslash && (c == 'n'))
c = '\n';
if(backslash && (c == 't'))
c = '\t';
}
backslash = false;
overflow = !underflow;
underflow = false;
cb = c;
}
if(underflow || overflow)
{
TokenError(i, "character must be exactly one character");
}
else
{
AppendToken(new TokenChar(emsg, filNam, lineNo, i - bolIdx, cb));
}
i = j;
continue;
}
/*
* Check for keywords/names.
*/
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_') || (c == '$' && options.dollarsigns))
{
int j;
for(j = i; ++j < source.Length;)
{
c = source[j];
if(c >= 'a' && c <= 'z')
continue;
if(c >= 'A' && c <= 'Z')
continue;
if(c >= '0' && c <= '9')
continue;
if(c == '$' && options.dollarsigns)
continue;
if(c != '_')
break;
}
if(j - i > MAX_NAME_LEN)
{
TokenError(i, "name too long, max " + MAX_NAME_LEN);
}
else
{
string name = source.Substring(i, j - i);
if(name == "quaternion")
name = "rotation"; // see lslangtest1.lsl
if(keywords.ContainsKey(name))
{
Object[] args = new Object[] { emsg, filNam, lineNo, i - bolIdx };
AppendToken((Token)keywords[name].Invoke(args));
}
else if(options.arrays && arrayKeywords.ContainsKey(name))
{
Object[] args = new Object[] { emsg, filNam, lineNo, i - bolIdx };
AppendToken((Token)arrayKeywords[name].Invoke(args));
}
else if(options.advFlowCtl && advFlowCtlKeywords.ContainsKey(name))
{
Object[] args = new Object[] { emsg, filNam, lineNo, i - bolIdx };
AppendToken((Token)advFlowCtlKeywords[name].Invoke(args));
}
else if(options.tryCatch && tryCatchKeywords.ContainsKey(name))
{
Object[] args = new Object[] { emsg, filNam, lineNo, i - bolIdx };
AppendToken((Token)tryCatchKeywords[name].Invoke(args));
}
else if(options.objects && objectsKeywords.ContainsKey(name))
{
Object[] args = new Object[] { emsg, filNam, lineNo, i - bolIdx };
AppendToken((Token)objectsKeywords[name].Invoke(args));
}
else if(options.chars && charsKeywords.ContainsKey(name))
{
Object[] args = new Object[] { emsg, filNam, lineNo, i - bolIdx };
AppendToken((Token)charsKeywords[name].Invoke(args));
}
else
{
AppendToken(new TokenName(emsg, filNam, lineNo, i - bolIdx, name));
}
}
i = --j;
continue;
}
/*
* Check for option enables.
*/
if((c == ';') && (lastToken is TokenName) &&
(lastToken.prevToken is TokenName) &&
(strcasecmp(((TokenName)lastToken.prevToken).val, "yoption") == 0))
{
string opt = ((TokenName)lastToken).val;
if(strcasecmp(opt, "allowall") == 0)
{
options.arrays = true;
options.advFlowCtl = true;
options.tryCatch = true;
options.objects = true;
options.chars = true;
// options.noRightToLeft = true;
options.dollarsigns = true;
}
else if(strcasecmp(opt, "arrays") == 0)
options.arrays = true;
else if(strcasecmp(opt, "advflowctl") == 0)
options.advFlowCtl = true;
else if(strcasecmp(opt, "trycatch") == 0)
options.tryCatch = true;
else if(strcasecmp(opt, "objects") == 0)
options.objects = true;
else if(strcasecmp(opt, "chars") == 0)
options.chars = true;
else if(strcasecmp(opt, "norighttoleft") == 0)
options.noRightToLeft = true;
else if(strcasecmp(opt, "dollarsigns") == 0)
options.dollarsigns = true;
else
lastToken.ErrorMsg("unknown YOption");
lastToken = lastToken.prevToken.prevToken;
lastToken.nextToken = null;
continue;
}
/*
* Lastly, check for delimeters.
*/
{
int j;
int len = 0;
for(j = 0; j < delims.Length; j++)
{
len = delims[j].str.Length;
if((i + len <= source.Length) && (source.Substring(i, len).Equals(delims[j].str)))
break;
}
if(j < delims.Length)
{
Object[] args = { emsg, filNam, lineNo, i - bolIdx };
Token kwToken = (Token)delims[j].ctorInfo.Invoke(args);
AppendToken(kwToken);
i += --len;
continue;
}
}
/*
* Don't know what it is!
*/
TokenError(i, "unknown character '" + c + "'");
}
}
private static int strcasecmp(String s, String t)
{
return String.Compare(s, t, StringComparison.OrdinalIgnoreCase);
}
/**
* @brief try to parse a floating-point number from the source
* @param i = starting position within this.source of number
* @returns 0: not a floating point number, try something else
* else: position in this.source of terminating character, ie, past number
* TokenFloat appended to token list
* or error message has been output
*/
private int TryParseFloat(int i)
{
bool decimals, error, negexp, nulexp;
char c;
double f, f10;
int exponent, j, x, y;
ulong m, mantissa;
decimals = false;
error = false;
exponent = 0;
mantissa = 0;
for(j = i; j < source.Length; j++)
{
c = source[j];
if((c >= '0') && (c <= '9'))
{
m = mantissa * 10 + (ulong)(c - '0');
if(m / 10 != mantissa)
{
if(!decimals)
exponent++;
}
else
{
mantissa = m;
if(decimals)
exponent--;
}
continue;
}
if(c == '.')
{
if(decimals)
{
TokenError(i, "more than one decimal point");
return j;
}
decimals = true;
continue;
}
if((c == 'E') || (c == 'e'))
{
if(++j >= source.Length)
{
TokenError(i, "floating exponent off end of source");
return j;
}
c = source[j];
negexp = (c == '-');
if(negexp || (c == '+'))
j++;
y = 0;
nulexp = true;
for(; j < source.Length; j++)
{
c = source[j];
if((c < '0') || (c > '9'))
break;
x = y * 10 + (c - '0');
if(x / 10 != y)
{
if(!error)
TokenError(i, "floating exponent overflow");
error = true;
}
y = x;
nulexp = false;
}
if(nulexp)
{
TokenError(i, "bad or missing floating exponent");
return j;
}
if(negexp)
{
x = exponent - y;
if(x > exponent)
{
if(!error)
TokenError(i, "floating exponent overflow");
error = true;
}
}
else
{
x = exponent + y;
if(x < exponent)
{
if(!error)
TokenError(i, "floating exponent overflow");
error = true;
}
}
exponent = x;
}
break;
}
if(!decimals)
{
return 0;
}
f = mantissa;
if((exponent != 0) && (mantissa != 0) && !error)
{
f10 = 10.0;
if(exponent < 0)
{
exponent = -exponent;
while(exponent > 0)
{
if((exponent & 1) != 0)
{
f /= f10;
}
exponent /= 2;
f10 *= f10;
}
}
else
{
while(exponent > 0)
{
if((exponent & 1) != 0)
{
f *= f10;
}
exponent /= 2;
f10 *= f10;
}
}
}
if(!error)
{
AppendToken(new TokenFloat(emsg, filNam, lineNo, i - bolIdx, f));
}
return j;
}
/**
* @brief try to parse an integer number from the source
* @param i = starting position within this.source of number
* @returns 0: not an integer number, try something else
* else: position in this.source of terminating character, ie, past number
* TokenInt appended to token list
* or error message has been output
*/
private int TryParseInt(int i)
{
bool error;
char c;
int j;
uint basse, m, mantissa;
basse = 10;
error = false;
mantissa = 0;
for(j = i; j < source.Length; j++)
{
c = source[j];
if((c >= '0') && (c <= '9'))
{
m = mantissa * basse + (uint)(c - '0');
if(m / basse != mantissa)
{
if(!error)
TokenError(i, "integer overflow");
error = true;
}
mantissa = m;
continue;
}
if((basse == 16) && ((c >= 'A') && (c <= 'F')))
{
m = mantissa * basse + (uint)(c - 'A') + 10U;
if(m / basse != mantissa)
{
if(!error)
TokenError(i, "integer overflow");
error = true;
}
mantissa = m;
continue;
}
if((basse == 16) && ((c >= 'a') && (c <= 'f')))
{
m = mantissa * basse + (uint)(c - 'a') + 10U;
if(m / basse != mantissa)
{
if(!error)
TokenError(i, "integer overflow");
error = true;
}
mantissa = m;
continue;
}
if(((c == 'x') || (c == 'X')) && (mantissa == 0) && (basse == 10))
{
basse = 16;
continue;
}
break;
}
if(!error)
{
AppendToken(new TokenInt(emsg, filNam, lineNo, i - bolIdx, (int)mantissa));
}
return j;
}
/**
* @brief append token on to end of list
* @param newToken = token to append
* @returns with token appended onto this.lastToken
*/
private void AppendToken(Token newToken)
{
newToken.nextToken = null;
newToken.prevToken = lastToken;
newToken.nr2l = this.options.noRightToLeft;
lastToken.nextToken = newToken;
lastToken = newToken;
}
/**
* @brief print tokenizing error message
* and remember that we've an error
* @param i = position within source file of the error
* @param message = error message text
* @returns with this.youveAnError set
*/
private void TokenError(int i, string message)
{
Token temp = new Token(this.emsg, this.filNam, this.lineNo, i - this.bolIdx);
temp.ErrorMsg(message);
youveAnError = true;
}
/**
* @brief get a token's constructor
* @param tokenType = token's type
* @returns token's constructor
*/
private static Type[] constrTypes = new Type[] {
typeof (TokenErrorMessage), typeof (string), typeof (int), typeof (int)
};
private static System.Reflection.ConstructorInfo GetTokenCtor(Type tokenType)
{
return tokenType.GetConstructor(constrTypes);
}
/**
* @brief delimeter table
*/
private class Delim
{
public string str;
public System.Reflection.ConstructorInfo ctorInfo;
public Delim(string str, Type type)
{
this.str = str;
ctorInfo = GetTokenCtor(type);
}
}
private static Delim[] delims = new Delim[] {
new Delim ("...", typeof (TokenKwDotDotDot)),
new Delim ("&&&", typeof (TokenKwAndAndAnd)),
new Delim ("|||", typeof (TokenKwOrOrOr)),
new Delim ("<<=", typeof (TokenKwAsnLSh)),
new Delim (">>=", typeof (TokenKwAsnRSh)),
new Delim ("<=", typeof (TokenKwCmpLE)),
new Delim (">=", typeof (TokenKwCmpGE)),
new Delim ("==", typeof (TokenKwCmpEQ)),
new Delim ("!=", typeof (TokenKwCmpNE)),
new Delim ("++", typeof (TokenKwIncr)),
new Delim ("--", typeof (TokenKwDecr)),
new Delim ("&&", typeof (TokenKwAndAnd)),
new Delim ("||", typeof (TokenKwOrOr)),
new Delim ("+=", typeof (TokenKwAsnAdd)),
new Delim ("&=", typeof (TokenKwAsnAnd)),
new Delim ("-=", typeof (TokenKwAsnSub)),
new Delim ("*=", typeof (TokenKwAsnMul)),
new Delim ("/=", typeof (TokenKwAsnDiv)),
new Delim ("%=", typeof (TokenKwAsnMod)),
new Delim ("|=", typeof (TokenKwAsnOr)),
new Delim ("^=", typeof (TokenKwAsnXor)),
new Delim ("<<", typeof (TokenKwLSh)),
new Delim (">>", typeof (TokenKwRSh)),
new Delim ("~", typeof (TokenKwTilde)),
new Delim ("!", typeof (TokenKwExclam)),
new Delim ("@", typeof (TokenKwAt)),
new Delim ("%", typeof (TokenKwMod)),
new Delim ("^", typeof (TokenKwXor)),
new Delim ("&", typeof (TokenKwAnd)),
new Delim ("*", typeof (TokenKwMul)),
new Delim ("(", typeof (TokenKwParOpen)),
new Delim (")", typeof (TokenKwParClose)),
new Delim ("-", typeof (TokenKwSub)),
new Delim ("+", typeof (TokenKwAdd)),
new Delim ("=", typeof (TokenKwAssign)),
new Delim ("{", typeof (TokenKwBrcOpen)),
new Delim ("}", typeof (TokenKwBrcClose)),
new Delim ("[", typeof (TokenKwBrkOpen)),
new Delim ("]", typeof (TokenKwBrkClose)),
new Delim (";", typeof (TokenKwSemi)),
new Delim (":", typeof (TokenKwColon)),
new Delim ("<", typeof (TokenKwCmpLT)),
new Delim (">", typeof (TokenKwCmpGT)),
new Delim (",", typeof (TokenKwComma)),
new Delim (".", typeof (TokenKwDot)),
new Delim ("?", typeof (TokenKwQMark)),
new Delim ("/", typeof (TokenKwDiv)),
new Delim ("|", typeof (TokenKwOr)),
new Delim ("#", typeof (TokenKwHash))
};
/**
* @brief keyword tables
* The keyword tables translate a keyword string
* to the corresponding token constructor.
*/
private static Dictionary<string, System.Reflection.ConstructorInfo> keywords = BuildKeywords();
private static Dictionary<string, System.Reflection.ConstructorInfo> arrayKeywords = BuildArrayKeywords();
private static Dictionary<string, System.Reflection.ConstructorInfo> advFlowCtlKeywords = BuildAdvFlowCtlKeywords();
private static Dictionary<string, System.Reflection.ConstructorInfo> tryCatchKeywords = BuildTryCatchKeywords();
private static Dictionary<string, System.Reflection.ConstructorInfo> objectsKeywords = BuildObjectsKeywords();
private static Dictionary<string, System.Reflection.ConstructorInfo> charsKeywords = BuildCharsKeywords();
private static Dictionary<string, System.Reflection.ConstructorInfo> BuildKeywords()
{
Dictionary<string, System.Reflection.ConstructorInfo> kws = new Dictionary<string, System.Reflection.ConstructorInfo>();
kws.Add("default", GetTokenCtor(typeof(TokenKwDefault)));
kws.Add("do", GetTokenCtor(typeof(TokenKwDo)));
kws.Add("else", GetTokenCtor(typeof(TokenKwElse)));
kws.Add("float", GetTokenCtor(typeof(TokenTypeFloat)));
kws.Add("for", GetTokenCtor(typeof(TokenKwFor)));
kws.Add("if", GetTokenCtor(typeof(TokenKwIf)));
kws.Add("integer", GetTokenCtor(typeof(TokenTypeInt)));
kws.Add("list", GetTokenCtor(typeof(TokenTypeList)));
kws.Add("jump", GetTokenCtor(typeof(TokenKwJump)));
kws.Add("key", GetTokenCtor(typeof(TokenTypeKey)));
kws.Add("return", GetTokenCtor(typeof(TokenKwRet)));
kws.Add("rotation", GetTokenCtor(typeof(TokenTypeRot)));
kws.Add("state", GetTokenCtor(typeof(TokenKwState)));
kws.Add("string", GetTokenCtor(typeof(TokenTypeStr)));
kws.Add("vector", GetTokenCtor(typeof(TokenTypeVec)));
kws.Add("while", GetTokenCtor(typeof(TokenKwWhile)));
return kws;
}
private static Dictionary<string, System.Reflection.ConstructorInfo> BuildArrayKeywords()
{
Dictionary<string, System.Reflection.ConstructorInfo> kws = new Dictionary<string, System.Reflection.ConstructorInfo>();
kws.Add("array", GetTokenCtor(typeof(TokenTypeArray)));
kws.Add("foreach", GetTokenCtor(typeof(TokenKwForEach)));
kws.Add("in", GetTokenCtor(typeof(TokenKwIn)));
kws.Add("is", GetTokenCtor(typeof(TokenKwIs)));
kws.Add("object", GetTokenCtor(typeof(TokenTypeObject)));
kws.Add("undef", GetTokenCtor(typeof(TokenKwUndef)));
return kws;
}
private static Dictionary<string, System.Reflection.ConstructorInfo> BuildAdvFlowCtlKeywords()
{
Dictionary<string, System.Reflection.ConstructorInfo> kws = new Dictionary<string, System.Reflection.ConstructorInfo>();
kws.Add("break", GetTokenCtor(typeof(TokenKwBreak)));
kws.Add("case", GetTokenCtor(typeof(TokenKwCase)));
kws.Add("constant", GetTokenCtor(typeof(TokenKwConst)));
kws.Add("continue", GetTokenCtor(typeof(TokenKwCont)));
kws.Add("switch", GetTokenCtor(typeof(TokenKwSwitch)));
return kws;
}
private static Dictionary<string, System.Reflection.ConstructorInfo> BuildTryCatchKeywords()
{
Dictionary<string, System.Reflection.ConstructorInfo> kws = new Dictionary<string, System.Reflection.ConstructorInfo>();
kws.Add("catch", GetTokenCtor(typeof(TokenKwCatch)));
kws.Add("exception", GetTokenCtor(typeof(TokenTypeExc)));
kws.Add("finally", GetTokenCtor(typeof(TokenKwFinally)));
kws.Add("throw", GetTokenCtor(typeof(TokenKwThrow)));
kws.Add("try", GetTokenCtor(typeof(TokenKwTry)));
return kws;
}
private static Dictionary<string, System.Reflection.ConstructorInfo> BuildObjectsKeywords()
{
Dictionary<string, System.Reflection.ConstructorInfo> kws = new Dictionary<string, System.Reflection.ConstructorInfo>();
kws.Add("abstract", GetTokenCtor(typeof(TokenKwAbstract)));
kws.Add("base", GetTokenCtor(typeof(TokenKwBase)));
kws.Add("class", GetTokenCtor(typeof(TokenKwClass)));
kws.Add("constructor", GetTokenCtor(typeof(TokenKwConstructor)));
kws.Add("delegate", GetTokenCtor(typeof(TokenKwDelegate)));
kws.Add("destructor", GetTokenCtor(typeof(TokenKwDestructor)));
kws.Add("final", GetTokenCtor(typeof(TokenKwFinal)));
kws.Add("get", GetTokenCtor(typeof(TokenKwGet)));
kws.Add("interface", GetTokenCtor(typeof(TokenKwInterface)));
kws.Add("new", GetTokenCtor(typeof(TokenKwNew)));
kws.Add("override", GetTokenCtor(typeof(TokenKwOverride)));
kws.Add("partial", GetTokenCtor(typeof(TokenKwPartial)));
kws.Add("private", GetTokenCtor(typeof(TokenKwPrivate)));
kws.Add("protected", GetTokenCtor(typeof(TokenKwProtected)));
kws.Add("public", GetTokenCtor(typeof(TokenKwPublic)));
kws.Add("set", GetTokenCtor(typeof(TokenKwSet)));
kws.Add("static", GetTokenCtor(typeof(TokenKwStatic)));
kws.Add("this", GetTokenCtor(typeof(TokenKwThis)));
kws.Add("typedef", GetTokenCtor(typeof(TokenKwTypedef)));
kws.Add("virtual", GetTokenCtor(typeof(TokenKwVirtual)));
return kws;
}
private static Dictionary<string, System.Reflection.ConstructorInfo> BuildCharsKeywords()
{
Dictionary<string, System.Reflection.ConstructorInfo> kws = new Dictionary<string, System.Reflection.ConstructorInfo>();
kws.Add("char", GetTokenCtor(typeof(TokenTypeChar)));
return kws;
}
}
/**
* @brief All output token types in addition to TokenBegin.
* They are all sub-types of Token.
*/
public class TokenChar: Token
{
public char val;
public TokenChar(TokenErrorMessage emsg, string file, int line, int posn, char val) : base(emsg, file, line, posn)
{
this.val = val;
}
public TokenChar(Token original, char val) : base(original)
{
this.val = val;
}
public override string ToString()
{
switch(val)
{
case '\'':
return "'\\''";
case '\\':
return "'\\\\'";
case '\n':
return "'\\n'";
case '\t':
return "'\\t'";
default:
return "'" + val + "'";
}
}
}
public class TokenFloat: Token
{
public double val;
public TokenFloat(TokenErrorMessage emsg, string file, int line, int posn, double val) : base(emsg, file, line, posn)
{
this.val = val;
}
public override string ToString()
{
return val.ToString();
}
}
public class TokenInt: Token
{
public int val;
public TokenInt(TokenErrorMessage emsg, string file, int line, int posn, int val) : base(emsg, file, line, posn)
{
this.val = val;
}
public TokenInt(Token original, int val) : base(original)
{
this.val = val;
}
public override string ToString()
{
return val.ToString();
}
}
public class TokenName: Token
{
public string val;
public TokenName(TokenErrorMessage emsg, string file, int line, int posn, string val) : base(emsg, file, line, posn)
{
this.val = val;
}
public TokenName(Token original, string val) : base(original)
{
this.val = val;
}
public override string ToString()
{
return this.val;
}
}
public class TokenStr: Token
{
public string val;
public TokenStr(TokenErrorMessage emsg, string file, int line, int posn, string val) : base(emsg, file, line, posn)
{
this.val = val;
}
public override string ToString()
{
if((val.IndexOf('"') < 0) &&
(val.IndexOf('\\') < 0) &&
(val.IndexOf('\n') < 0) &&
(val.IndexOf('\t') < 0))
return "\"" + val + "\"";
int len = val.Length;
StringBuilder sb = new StringBuilder(len * 2 + 2);
sb.Append('"');
for(int i = 0; i < len; i++)
{
char c = val[i];
switch(c)
{
case '"':
{
sb.Append('\\');
sb.Append('"');
break;
}
case '\\':
{
sb.Append('\\');
sb.Append('\\');
break;
}
case '\n':
{
sb.Append('\\');
sb.Append('n');
break;
}
case '\t':
{
sb.Append('\\');
sb.Append('t');
break;
}
default:
{
sb.Append(c);
break;
}
}
}
return sb.ToString();
}
}
/*
* This one marks the end-of-file.
*/
public class TokenEnd: Token
{
public TokenEnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
}
/*
* Various keywords and delimeters.
*/
public delegate object TokenRValConstBinOpDelegate(object left, object right);
public delegate object TokenRValConstUnOpDelegate(object right);
public class TokenKw: Token
{
public TokenRValConstBinOpDelegate binOpConst;
public TokenRValConstUnOpDelegate unOpConst;
public bool sdtClassOp;
public TokenKw(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{
}
public TokenKw(Token original) : base(original)
{
}
}
public class TokenKwDotDotDot: TokenKw
{
public TokenKwDotDotDot(TokenErrorMessage emsg, string file,
int line, int posn) : base(emsg, file, line, posn)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public TokenKwDotDotDot(Token original) : base(original)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public override string ToString()
{
return "...";
}
}
public class TokenKwAndAndAnd: TokenKw
{
public TokenKwAndAndAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public TokenKwAndAndAnd(Token original) : base(original)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public override string ToString()
{
return "&&&";
}
}
public class TokenKwOrOrOr: TokenKw
{
public TokenKwOrOrOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public TokenKwOrOrOr(Token original) : base(original)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public override string ToString()
{
return "|||";
}
}
public class TokenKwAsnLSh: TokenKw
{
public TokenKwAsnLSh(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = true;
}
public TokenKwAsnLSh(Token original) : base(original)
{
binOpConst = TokenRValConstOps.Null;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = true;
}
public override string ToString()
{
return "<<=";
}
}
public class TokenKwAsnRSh: TokenKw
{
public TokenKwAsnRSh(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnRSh(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return ">>=";
}
}
public class TokenKwCmpLE: TokenKw
{
public TokenKwCmpLE(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwCmpLE(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "<=";
}
}
public class TokenKwCmpGE: TokenKw
{
public TokenKwCmpGE(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwCmpGE(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return ">=";
}
}
public class TokenKwCmpEQ: TokenKw
{
public TokenKwCmpEQ(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwCmpEQ(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "==";
}
}
public class TokenKwCmpNE: TokenKw
{
public TokenKwCmpNE(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwCmpNE(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "!=";
}
}
public class TokenKwIncr: TokenKw
{
public TokenKwIncr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwIncr(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "++";
}
}
public class TokenKwDecr: TokenKw
{
public TokenKwDecr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwDecr(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "--";
}
}
public class TokenKwAndAnd: TokenKw
{
public TokenKwAndAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAndAnd(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "&&";
}
}
public class TokenKwOrOr: TokenKw
{
public TokenKwOrOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwOrOr(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "||";
}
}
public class TokenKwAsnAdd: TokenKw
{
public TokenKwAsnAdd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnAdd(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "+=";
}
}
public class TokenKwAsnAnd: TokenKw
{
public TokenKwAsnAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnAnd(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "&=";
}
}
public class TokenKwAsnSub: TokenKw
{
public TokenKwAsnSub(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnSub(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "-=";
}
}
public class TokenKwAsnMul: TokenKw
{
public TokenKwAsnMul(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnMul(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "*=";
}
}
public class TokenKwAsnDiv: TokenKw
{
public TokenKwAsnDiv(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnDiv(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "/=";
}
}
public class TokenKwAsnMod: TokenKw
{
public TokenKwAsnMod(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnMod(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "%=";
}
}
public class TokenKwAsnOr: TokenKw
{
public TokenKwAsnOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnOr(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "|=";
}
}
public class TokenKwAsnXor: TokenKw
{
public TokenKwAsnXor(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAsnXor(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "^=";
}
}
public class TokenKwLSh: TokenKw
{
public TokenKwLSh(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.LSh; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwLSh(Token original) : base(original) { binOpConst = TokenRValConstOps.LSh; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "<<";
}
}
public class TokenKwRSh: TokenKw
{
public TokenKwRSh(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.RSh; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwRSh(Token original) : base(original) { binOpConst = TokenRValConstOps.RSh; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return ">>";
}
}
public class TokenKwTilde: TokenKw
{
public TokenKwTilde(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Not; sdtClassOp = true; }
public TokenKwTilde(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Not; sdtClassOp = true; }
public override string ToString()
{
return "~";
}
}
public class TokenKwExclam: TokenKw
{
public TokenKwExclam(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwExclam(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "!";
}
}
public class TokenKwAt: TokenKw
{
public TokenKwAt(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwAt(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "@";
}
}
public class TokenKwMod: TokenKw
{
public TokenKwMod(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Mod; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwMod(Token original) : base(original) { binOpConst = TokenRValConstOps.Mod; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "%";
}
}
public class TokenKwXor: TokenKw
{
public TokenKwXor(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Xor; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwXor(Token original) : base(original) { binOpConst = TokenRValConstOps.Xor; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "^";
}
}
public class TokenKwAnd: TokenKw
{
public TokenKwAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.And; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAnd(Token original) : base(original) { binOpConst = TokenRValConstOps.And; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "&";
}
}
public class TokenKwMul: TokenKw
{
public TokenKwMul(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Mul; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwMul(Token original) : base(original) { binOpConst = TokenRValConstOps.Mul; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "*";
}
}
public class TokenKwParOpen: TokenKw
{
public TokenKwParOpen(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwParOpen(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "(";
}
}
public class TokenKwParClose: TokenKw
{
public TokenKwParClose(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwParClose(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return ")";
}
}
public class TokenKwSub: TokenKw
{
public TokenKwSub(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Sub; unOpConst = TokenRValConstOps.Neg; sdtClassOp = true; }
public TokenKwSub(Token original) : base(original) { binOpConst = TokenRValConstOps.Sub; unOpConst = TokenRValConstOps.Neg; sdtClassOp = true; }
public override string ToString()
{
return "-";
}
}
public class TokenKwAdd: TokenKw
{
public TokenKwAdd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Add; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAdd(Token original) : base(original) { binOpConst = TokenRValConstOps.Add; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "+";
}
}
public class TokenKwAssign: TokenKw
{
public TokenKwAssign(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwAssign(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "=";
}
}
public class TokenKwBrcOpen: TokenKw
{
public TokenKwBrcOpen(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwBrcOpen(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "{";
}
}
public class TokenKwBrcClose: TokenKw
{
public TokenKwBrcClose(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwBrcClose(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "}";
}
}
public class TokenKwBrkOpen: TokenKw
{
public TokenKwBrkOpen(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwBrkOpen(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "[";
}
}
public class TokenKwBrkClose: TokenKw
{
public TokenKwBrkClose(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwBrkClose(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "]";
}
}
public class TokenKwSemi: TokenKw
{
public TokenKwSemi(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwSemi(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return ";";
}
}
public class TokenKwColon: TokenKw
{
public TokenKwColon(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwColon(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return ":";
}
}
public class TokenKwCmpLT: TokenKw
{
public TokenKwCmpLT(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwCmpLT(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "<";
}
}
public class TokenKwCmpGT: TokenKw
{
public TokenKwCmpGT(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwCmpGT(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return ">";
}
}
public class TokenKwComma: TokenKw
{
public TokenKwComma(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwComma(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return ",";
}
}
public class TokenKwDot: TokenKw
{
public TokenKwDot(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwDot(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return ".";
}
}
public class TokenKwQMark: TokenKw
{
public TokenKwQMark(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwQMark(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "?";
}
}
public class TokenKwDiv: TokenKw
{
public TokenKwDiv(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Div; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwDiv(Token original) : base(original) { binOpConst = TokenRValConstOps.Div; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "/";
}
}
public class TokenKwOr: TokenKw
{
public TokenKwOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Or; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwOr(Token original) : base(original) { binOpConst = TokenRValConstOps.Or; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "|";
}
}
public class TokenKwHash: TokenKw
{
public TokenKwHash(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwHash(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "#";
}
}
public class TokenKwAbstract: TokenKw
{
public TokenKwAbstract(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwAbstract(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "abstract";
}
}
public class TokenKwBase: TokenKw
{
public TokenKwBase(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwBase(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "base";
}
}
public class TokenKwBreak: TokenKw
{
public TokenKwBreak(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwBreak(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "break";
}
}
public class TokenKwCase: TokenKw
{
public TokenKwCase(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwCase(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "case";
}
}
public class TokenKwCatch: TokenKw
{
public TokenKwCatch(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwCatch(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "catch";
}
}
public class TokenKwClass: TokenKw
{
public TokenKwClass(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwClass(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "class";
}
}
public class TokenKwConst: TokenKw
{
public TokenKwConst(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwConst(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "constant";
}
}
public class TokenKwConstructor: TokenKw
{
public TokenKwConstructor(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwConstructor(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "constructor";
}
}
public class TokenKwCont: TokenKw
{
public TokenKwCont(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwCont(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "continue";
}
}
public class TokenKwDelegate: TokenKw
{
public TokenKwDelegate(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwDelegate(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "delegate";
}
}
public class TokenKwDefault: TokenKw
{
public TokenKwDefault(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwDefault(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "default";
}
}
public class TokenKwDestructor: TokenKw
{
public TokenKwDestructor(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwDestructor(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "destructor";
}
}
public class TokenKwDo: TokenKw
{
public TokenKwDo(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwDo(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "do";
}
}
public class TokenKwElse: TokenKw
{
public TokenKwElse(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwElse(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "else";
}
}
public class TokenKwFinal: TokenKw
{
public TokenKwFinal(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwFinal(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "final";
}
}
public class TokenKwFinally: TokenKw
{
public TokenKwFinally(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwFinally(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "finally";
}
}
public class TokenKwFor: TokenKw
{
public TokenKwFor(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwFor(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "for";
}
}
public class TokenKwForEach: TokenKw
{
public TokenKwForEach(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwForEach(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "foreach";
}
}
public class TokenKwGet: TokenKw
{
public TokenKwGet(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwGet(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "get";
}
}
public class TokenKwIf: TokenKw
{
public TokenKwIf(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwIf(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "if";
}
}
public class TokenKwIn: TokenKw
{
public TokenKwIn(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwIn(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "in";
}
}
public class TokenKwInterface: TokenKw
{
public TokenKwInterface(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwInterface(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "interface";
}
}
public class TokenKwIs: TokenKw
{
public TokenKwIs(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwIs(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "is";
}
}
public class TokenKwJump: TokenKw
{
public TokenKwJump(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwJump(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "jump";
}
}
public class TokenKwNew: TokenKw
{
public TokenKwNew(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwNew(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "new";
}
}
public class TokenKwOverride: TokenKw
{
public TokenKwOverride(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwOverride(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "override";
}
}
public class TokenKwPartial: TokenKw
{
public TokenKwPartial(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwPartial(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "partial";
}
}
public class TokenKwPrivate: TokenKw
{
public TokenKwPrivate(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwPrivate(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "private";
}
}
public class TokenKwProtected: TokenKw
{
public TokenKwProtected(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwProtected(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "protected";
}
}
public class TokenKwPublic: TokenKw
{
public TokenKwPublic(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwPublic(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "public";
}
}
public class TokenKwRet: TokenKw
{
public TokenKwRet(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwRet(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "return";
}
}
public class TokenKwSet: TokenKw
{
public TokenKwSet(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwSet(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "set";
}
}
public class TokenKwState: TokenKw
{
public TokenKwState(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwState(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "state";
}
}
public class TokenKwStatic: TokenKw
{
public TokenKwStatic(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwStatic(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "static";
}
}
public class TokenKwSwitch: TokenKw
{
public TokenKwSwitch(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwSwitch(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "switch";
}
}
public class TokenKwThis: TokenKw
{
public TokenKwThis(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwThis(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "this";
}
}
public class TokenKwThrow: TokenKw
{
public TokenKwThrow(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwThrow(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "throw";
}
}
public class TokenKwTry: TokenKw
{
public TokenKwTry(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwTry(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "try";
}
}
public class TokenKwTypedef: TokenKw
{
public TokenKwTypedef(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwTypedef(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "typedef";
}
}
public class TokenKwUndef: TokenKw
{
public TokenKwUndef(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwUndef(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "undef";
}
}
public class TokenKwVirtual: TokenKw
{
public TokenKwVirtual(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwVirtual(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "virtual";
}
}
public class TokenKwWhile: TokenKw
{
public TokenKwWhile(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public TokenKwWhile(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = false; }
public override string ToString()
{
return "while";
}
}
/**
* @brief These static functions attempt to perform arithmetic on two constant
* operands to generate the resultant constant.
* Likewise for unary operators.
*
* @param left = left-hand value
* @param right = right-hand value
* @returns null: not able to perform computation
* else: resultant value object
*
* Note: it is ok for these to throw any exception (such as overflow or div-by-zero),
* and it will be treated as the 'not able to perform computation' case.
*/
public class TokenRValConstOps
{
public static object Null(object left, object right)
{
return null;
}
public static object Div(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left / (int)right;
}
if((left is int) && (right is double))
{
return (int)left / (double)right;
}
if((left is double) && (right is int))
{
return (double)left / (int)right;
}
if((left is double) && (right is double))
{
return (double)left / (double)right;
}
return null;
}
public static object Mod(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left % (int)right;
}
if((left is int) && (right is double))
{
return (int)left % (double)right;
}
if((left is double) && (right is int))
{
return (double)left % (int)right;
}
if((left is double) && (right is double))
{
return (double)left % (double)right;
}
return null;
}
public static object Mul(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left * (int)right;
}
if((left is int) && (right is double))
{
return (int)left * (double)right;
}
if((left is double) && (right is int))
{
return (double)left * (int)right;
}
if((left is double) && (right is double))
{
return (double)left * (double)right;
}
return null;
}
public static object And(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left & (int)right;
}
if((left is int) && (right is double))
{
return (int)left & (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left & (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left & (int)(double)right;
}
return null;
}
public static object LSh(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left << (int)right;
}
if((left is int) && (right is double))
{
return (int)left << (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left << (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left << (int)(double)right;
}
return null;
}
public static object Or(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left | (int)right;
}
if((left is int) && (right is double))
{
return (int)left | (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left | (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left | (int)(double)right;
}
return null;
}
public static object RSh(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left >> (int)right;
}
if((left is int) && (right is double))
{
return (int)left >> (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left >> (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left >> (int)(double)right;
}
return null;
}
public static object Xor(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left ^ (int)right;
}
if((left is int) && (right is double))
{
return (int)left ^ (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left ^ (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left ^ (int)(double)right;
}
return null;
}
public static object Add(object left, object right)
{
if((left is char) && (right is int))
{
return (char)((char)left + (int)right);
}
if((left is double) && (right is double))
{
return (double)left + (double)right;
}
if((left is double) && (right is int))
{
return (double)left + (int)right;
}
if((left is double) && (right is string))
{
return TypeCast.FloatToString((double)left) + (string)right;
}
if((left is int) && (right is double))
{
return (int)left + (double)right;
}
if((left is int) && (right is int))
{
return (int)left + (int)right;
}
if((left is int) && (right is string))
{
return TypeCast.IntegerToString((int)left) + (string)right;
}
if((left is string) && (right is char))
{
return (string)left + (char)right;
}
if((left is string) && (right is double))
{
return (string)left + TypeCast.FloatToString((double)right);
}
if((left is string) && (right is int))
{
return (string)left + TypeCast.IntegerToString((int)right);
}
if((left is string) && (right is string))
{
return (string)left + (string)right;
}
return null;
}
public static object Sub(object left, object right)
{
if((left is char) && (right is int))
{
return (char)((char)left - (int)right);
}
if((left is int) && (right is int))
{
return (int)left - (int)right;
}
if((left is int) && (right is double))
{
return (int)left - (double)right;
}
if((left is double) && (right is int))
{
return (double)left - (int)right;
}
if((left is double) && (right is double))
{
return (double)left - (double)right;
}
return null;
}
public static object Null(object right)
{
return null;
}
public static object Neg(object right)
{
if(right is int)
{
return -(int)right;
}
if(right is double)
{
return -(double)right;
}
return null;
}
public static object Not(object right)
{
if(right is int)
{
return ~(int)right;
}
return null;
}
}
/*
* Various datatypes.
*/
public abstract class TokenType: Token
{
public TokenType(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenType(Token original) : base(original) { }
public static TokenType FromSysType(Token original, System.Type typ)
{
if(typ == typeof(LSL_List))
return new TokenTypeList(original);
if(typ == typeof(LSL_Rotation))
return new TokenTypeRot(original);
if(typ == typeof(void))
return new TokenTypeVoid(original);
if(typ == typeof(LSL_Vector))
return new TokenTypeVec(original);
if(typ == typeof(float))
return new TokenTypeFloat(original);
if(typ == typeof(int))
return new TokenTypeInt(original);
if(typ == typeof(string))
return new TokenTypeStr(original);
if(typ == typeof(double))
return new TokenTypeFloat(original);
if(typ == typeof(bool))
return new TokenTypeBool(original);
if(typ == typeof(object))
return new TokenTypeObject(original);
if(typ == typeof(XMR_Array))
return new TokenTypeArray(original);
if(typ == typeof(LSL_Integer))
return new TokenTypeLSLInt(original);
if(typ == typeof(LSL_Float))
return new TokenTypeLSLFloat(original);
if(typ == typeof(LSL_String))
return new TokenTypeLSLString(original);
if(typ == typeof(char))
return new TokenTypeChar(original);
if(typ == typeof(Exception))
return new TokenTypeExc(original);
throw new Exception("unknown script type " + typ.ToString());
}
public static TokenType FromLSLType(Token original, string typ)
{
if(typ == "list")
return new TokenTypeList(original);
if(typ == "rotation")
return new TokenTypeRot(original);
if(typ == "vector")
return new TokenTypeVec(original);
if(typ == "float")
return new TokenTypeFloat(original);
if(typ == "integer")
return new TokenTypeInt(original);
if(typ == "key")
return new TokenTypeKey(original);
if(typ == "string")
return new TokenTypeStr(original);
if(typ == "object")
return new TokenTypeObject(original);
if(typ == "array")
return new TokenTypeArray(original);
if(typ == "bool")
return new TokenTypeBool(original);
if(typ == "void")
return new TokenTypeVoid(original);
if(typ == "char")
return new TokenTypeChar(original);
if(typ == "exception")
return new TokenTypeExc(original);
throw new Exception("unknown type " + typ);
}
/**
* @brief Estimate the number of bytes of memory taken by one of these
* objects. For objects with widely varying size, return the
* smallest it can be.
*/
public static int StaticSize(System.Type typ)
{
if(typ == typeof(LSL_List))
return 96;
if(typ == typeof(LSL_Rotation))
return 80;
if(typ == typeof(void))
return 0;
if(typ == typeof(LSL_Vector))
return 72;
if(typ == typeof(float))
return 8;
if(typ == typeof(int))
return 8;
if(typ == typeof(string))
return 40;
if(typ == typeof(double))
return 8;
if(typ == typeof(bool))
return 8;
if(typ == typeof(XMR_Array))
return 96;
if(typ == typeof(object))
return 32;
if(typ == typeof(char))
return 2;
if(typ == typeof(LSL_Integer))
return 32;
if(typ == typeof(LSL_Float))
return 32;
if(typ == typeof(LSL_String))
return 40;
throw new Exception("unknown type " + typ.ToString());
}
/**
* @brief Return the corresponding system type.
*/
public abstract Type ToSysType();
/**
* @brief Return the equivalent LSL wrapping type.
*
* null: normal
* else: LSL-style wrapping, ie, LSL_Integer, LSL_Float, LSL_String
* ToSysType()=System.Int32; lslWrapping=LSL_Integer
* ToSysType()=System.Float; lslWrapping=LSL_Float
* ToSysType()=System.String; lslWrapping=LSL_String
*/
public virtual Type ToLSLWrapType()
{
return null;
}
/**
* @brief Assign slots in either the global variable arrays or the script-defined type instance arrays.
* These only need to be implemented for script-visible types, ie, those that a script writer
* can actually define a variable as.
*/
public virtual void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
throw new Exception("not implemented for " + ToString() + " (" + GetType() + ")");
}
/**
* @brief Get heap tracking type.
* null indicates there is no heap tracker for the type.
*/
public virtual Type ToHeapTrackerType()
{
return null;
}
public virtual ConstructorInfo GetHeapTrackerCtor()
{
throw new ApplicationException("no GetHeapTrackerCtor for " + this.GetType());
}
public virtual void CallHeapTrackerPopMeth(Token errorAt, ScriptMyILGen ilGen)
{
throw new ApplicationException("no CallHeapTrackerPopMeth for " + this.GetType());
}
public virtual void CallHeapTrackerPushMeth(Token errorAt, ScriptMyILGen ilGen)
{
throw new ApplicationException("no CallHeapTrackerPushMeth for " + this.GetType());
}
}
public class TokenTypeArray: TokenType
{
private static readonly FieldInfo iarArraysFieldInfo = typeof(XMRInstArrays).GetField("iarArrays");
public TokenTypeArray(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeArray(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(XMR_Array);
}
public override string ToString()
{
return "array";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarArraysFieldInfo;
declVar.vTableIndex = arSizes.iasArrays++;
}
}
public class TokenTypeBool: TokenType
{
public TokenTypeBool(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeBool(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(bool);
}
public override string ToString()
{
return "bool";
}
}
public class TokenTypeChar: TokenType
{
private static readonly FieldInfo iarCharsFieldInfo = typeof(XMRInstArrays).GetField("iarChars");
public TokenTypeChar(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeChar(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(char);
}
public override string ToString()
{
return "char";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarCharsFieldInfo;
declVar.vTableIndex = arSizes.iasChars++;
}
}
public class TokenTypeExc: TokenType
{
private static readonly FieldInfo iarObjectsFieldInfo = typeof(XMRInstArrays).GetField("iarObjects");
public TokenTypeExc(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeExc(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(Exception);
}
public override string ToString()
{
return "exception";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarObjectsFieldInfo;
declVar.vTableIndex = arSizes.iasObjects++;
}
}
public class TokenTypeFloat: TokenType
{
private static readonly FieldInfo iarFloatsFieldInfo = typeof(XMRInstArrays).GetField("iarFloats");
public TokenTypeFloat(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeFloat(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(double);
}
public override string ToString()
{
return "float";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarFloatsFieldInfo;
declVar.vTableIndex = arSizes.iasFloats++;
}
}
public class TokenTypeInt: TokenType
{
private static readonly FieldInfo iarIntegersFieldInfo = typeof(XMRInstArrays).GetField("iarIntegers");
public TokenTypeInt(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeInt(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(int);
}
public override string ToString()
{
return "integer";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarIntegersFieldInfo;
declVar.vTableIndex = arSizes.iasIntegers++;
}
}
public class TokenTypeKey: TokenType
{
private static readonly FieldInfo iarStringsFieldInfo = typeof(XMRInstArrays).GetField("iarStrings");
public TokenTypeKey(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeKey(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(string);
}
public override string ToString()
{
return "key";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarStringsFieldInfo;
declVar.vTableIndex = arSizes.iasStrings++;
}
}
public class TokenTypeList: TokenType
{
private static readonly FieldInfo iarListsFieldInfo = typeof(XMRInstArrays).GetField("iarLists");
private static readonly ConstructorInfo htListCtor = typeof(HeapTrackerList).GetConstructor(new Type[] { typeof(XMRInstAbstract) });
public TokenTypeList(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeList(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(LSL_List);
}
public override string ToString()
{
return "list";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarListsFieldInfo;
declVar.vTableIndex = arSizes.iasLists++;
}
public override Type ToHeapTrackerType()
{
return typeof(HeapTrackerList);
}
public override ConstructorInfo GetHeapTrackerCtor()
{
return htListCtor;
}
public override void CallHeapTrackerPopMeth(Token errorAt, ScriptMyILGen ilGen)
{
HeapTrackerList.GenPop(errorAt, ilGen);
}
public override void CallHeapTrackerPushMeth(Token errorAt, ScriptMyILGen ilGen)
{
HeapTrackerList.GenPush(errorAt, ilGen);
}
}
public class TokenTypeObject: TokenType
{
private static readonly FieldInfo iarObjectsFieldInfo = typeof(XMRInstArrays).GetField("iarObjects");
private static readonly ConstructorInfo htObjectCtor = typeof(HeapTrackerObject).GetConstructor(new Type[] { typeof(XMRInstAbstract) });
public TokenTypeObject(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeObject(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(object);
}
public override string ToString()
{
return "object";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarObjectsFieldInfo;
declVar.vTableIndex = arSizes.iasObjects++;
}
public override Type ToHeapTrackerType()
{
return typeof(HeapTrackerObject);
}
public override ConstructorInfo GetHeapTrackerCtor()
{
return htObjectCtor;
}
public override void CallHeapTrackerPopMeth(Token errorAt, ScriptMyILGen ilGen)
{
HeapTrackerObject.GenPop(errorAt, ilGen);
}
public override void CallHeapTrackerPushMeth(Token errorAt, ScriptMyILGen ilGen)
{
HeapTrackerObject.GenPush(errorAt, ilGen);
}
}
public class TokenTypeRot: TokenType
{
private static readonly FieldInfo iarRotationsFieldInfo = typeof(XMRInstArrays).GetField("iarRotations");
public TokenTypeRot(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeRot(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(LSL_Rotation);
}
public override string ToString()
{
return "rotation";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarRotationsFieldInfo;
declVar.vTableIndex = arSizes.iasRotations++;
}
}
public class TokenTypeStr: TokenType
{
private static readonly FieldInfo iarStringsFieldInfo = typeof(XMRInstArrays).GetField("iarStrings");
private static readonly ConstructorInfo htStringCtor = typeof(HeapTrackerString).GetConstructor(new Type[] { typeof(XMRInstAbstract) });
public TokenTypeStr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeStr(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(string);
}
public override string ToString()
{
return "string";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarStringsFieldInfo;
declVar.vTableIndex = arSizes.iasStrings++;
}
public override Type ToHeapTrackerType()
{
return typeof(HeapTrackerString);
}
public override ConstructorInfo GetHeapTrackerCtor()
{
return htStringCtor;
}
public override void CallHeapTrackerPopMeth(Token errorAt, ScriptMyILGen ilGen)
{
HeapTrackerString.GenPop(errorAt, ilGen);
}
public override void CallHeapTrackerPushMeth(Token errorAt, ScriptMyILGen ilGen)
{
HeapTrackerString.GenPush(errorAt, ilGen);
}
}
public class TokenTypeUndef: TokenType
{ // for the 'undef' constant, ie, null object pointer
public TokenTypeUndef(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeUndef(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(object);
}
public override string ToString()
{
return "undef";
}
}
public class TokenTypeVec: TokenType
{
private static readonly FieldInfo iarVectorsFieldInfo = typeof(XMRInstArrays).GetField("iarVectors");
public TokenTypeVec(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeVec(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(LSL_Vector);
}
public override string ToString()
{
return "vector";
}
public override void AssignVarSlot(TokenDeclVar declVar, XMRInstArSizes arSizes)
{
declVar.vTableArray = iarVectorsFieldInfo;
declVar.vTableIndex = arSizes.iasVectors++;
}
}
public class TokenTypeVoid: TokenType
{ // used only for function/method return types
public TokenTypeVoid(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeVoid(Token original) : base(original) { }
public override Type ToSysType()
{
return typeof(void);
}
public override string ToString()
{
return "void";
}
}
public class TokenTypeLSLFloat: TokenTypeFloat
{
public TokenTypeLSLFloat(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeLSLFloat(Token original) : base(original) { }
public override Type ToLSLWrapType()
{
return typeof(LSL_Float);
}
}
public class TokenTypeLSLInt: TokenTypeInt
{
public TokenTypeLSLInt(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeLSLInt(Token original) : base(original) { }
public override Type ToLSLWrapType()
{
return typeof(LSL_Integer);
}
}
public class TokenTypeLSLKey: TokenTypeKey
{
public TokenTypeLSLKey(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeLSLKey(Token original) : base(original) { }
public override Type ToLSLWrapType()
{
return typeof(LSL_Key);
}
}
public class TokenTypeLSLString: TokenTypeStr
{
public TokenTypeLSLString(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }
public TokenTypeLSLString(Token original) : base(original) { }
public override Type ToLSLWrapType()
{
return typeof(LSL_String);
}
}
}