172 lines
No EOL
3.6 KiB
C#
172 lines
No EOL
3.6 KiB
C#
#if UNITY_EDITOR
|
|
using System.Collections.Generic;
|
|
|
|
namespace SLZ.Bonelab
|
|
{
|
|
public class SILexicon
|
|
{
|
|
public enum CmdType : int
|
|
{
|
|
Invalid = -1,
|
|
InjectPoint = 0,
|
|
InjectDefault,
|
|
InjectBegin,
|
|
InjectEnd,
|
|
TexcoordCounter
|
|
}
|
|
|
|
public struct InjectorCommand
|
|
{
|
|
public CmdType command;
|
|
public int intParam;
|
|
public int cmdStartIndex;
|
|
public int cmdEndIndex;
|
|
public string strParam;
|
|
}
|
|
|
|
public static string injectorPrefix = "//#!";
|
|
|
|
public static Dictionary<string, CmdType> Lexicon = new Dictionary<string, CmdType>()
|
|
{
|
|
{ "INJECT_POINT", CmdType.InjectPoint },
|
|
{ "INJECT_DEFAULT", CmdType.InjectDefault },
|
|
{ "INJECT_BEGIN", CmdType.InjectBegin },
|
|
{ "INJECT_END", CmdType.InjectEnd },
|
|
{ "TEXCOORD", CmdType.TexcoordCounter },
|
|
};
|
|
|
|
public static Dictionary<CmdType, string> Lexicon2 = new Dictionary<CmdType, string>()
|
|
{
|
|
{ CmdType.InjectPoint, "INJECT_POINT" },
|
|
{ CmdType.InjectDefault, "INJECT_DEFAULT" },
|
|
{ CmdType.InjectBegin, "INJECT_BEGIN" },
|
|
{ CmdType.InjectEnd, "INJECT_END" },
|
|
{ CmdType.TexcoordCounter, "TEXCOORD" }
|
|
};
|
|
|
|
static SILexicon s_Instance;
|
|
|
|
public static SILexicon Instance
|
|
{
|
|
get
|
|
{
|
|
if (s_Instance == null)
|
|
s_Instance = new SILexicon();
|
|
return s_Instance;
|
|
}
|
|
}
|
|
|
|
SILexicon()
|
|
{
|
|
generateTree();
|
|
}
|
|
|
|
class TreeNode
|
|
{
|
|
public char nodeChar;
|
|
public CmdType command;
|
|
public List<TreeNode> nextNode;
|
|
public bool terminalNode;
|
|
}
|
|
|
|
TreeNode LexTreeHeadNode;
|
|
|
|
void generateTree()
|
|
{
|
|
string[] cmdArray = new string[Lexicon.Count];
|
|
Lexicon.Keys.CopyTo(cmdArray, 0);
|
|
List<string> commands = new List<string>(cmdArray);
|
|
LexTreeHeadNode = new TreeNode();
|
|
populateNode(ref LexTreeHeadNode, commands, 0);
|
|
}
|
|
|
|
void populateNode(ref TreeNode node, List<string> cmds, int index)
|
|
{
|
|
List<char> nextChars = new List<char>();
|
|
//Get list of strings with charact
|
|
for (int i = 0; i < cmds.Count; i++)
|
|
{
|
|
if (index < cmds[i].Length)
|
|
{
|
|
char idxChar = cmds[i][index];
|
|
if (!nextChars.Contains(idxChar))
|
|
{
|
|
nextChars.Add(idxChar);
|
|
}
|
|
}
|
|
else if (index == cmds[i].Length)
|
|
{
|
|
node.terminalNode = true;
|
|
node.command = Lexicon[cmds[i]];
|
|
//Debug.Log("Terminal Node: " + cmds[i] + " " + node.nodeChar);
|
|
}
|
|
}
|
|
|
|
if (nextChars.Count > 0)
|
|
{
|
|
node.nextNode = new List<TreeNode>();
|
|
int nextIndex = index + 1;
|
|
foreach (char nextChar in nextChars)
|
|
{
|
|
TreeNode treeNode = new TreeNode();
|
|
treeNode.nodeChar = nextChar;
|
|
|
|
List<string> nextCmds = new List<string>();
|
|
foreach (string currCmd in cmds)
|
|
{
|
|
if (currCmd[index] == nextChar)
|
|
{
|
|
nextCmds.Add(currCmd);
|
|
}
|
|
}
|
|
|
|
populateNode(ref treeNode, nextCmds, nextIndex);
|
|
node.nextNode.Add(treeNode);
|
|
}
|
|
}
|
|
}
|
|
|
|
public CmdType parseCommand(string word)
|
|
{
|
|
TreeNode CurrentNode = LexTreeHeadNode;
|
|
TreeNode nextNode = null;
|
|
for (int i = 0; i < word.Length; i++)
|
|
{
|
|
nextNode = null;
|
|
if (CurrentNode.nextNode != null)
|
|
{
|
|
foreach (TreeNode node in CurrentNode.nextNode)
|
|
{
|
|
if (node.nodeChar == word[i])
|
|
{
|
|
nextNode = node;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (nextNode != null)
|
|
{
|
|
CurrentNode = nextNode;
|
|
}
|
|
else
|
|
{
|
|
//Debug.LogError("Command Longer than tree");
|
|
return CmdType.Invalid;
|
|
}
|
|
}
|
|
|
|
if (CurrentNode != null && CurrentNode.terminalNode)
|
|
{
|
|
//Debug.Log("Valid Command " + CurrentNode.command);
|
|
return CurrentNode.command;
|
|
}
|
|
else
|
|
{
|
|
//Debug.LogError("Reached end of word without finding terminal node");
|
|
return CmdType.Invalid;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif |