This commit is contained in:
@@ -27,10 +27,12 @@ namespace Axiom.Interpreter
|
||||
symbolTable=new SymbolTable();
|
||||
IsInError=false;
|
||||
}
|
||||
|
||||
~CodeRunner()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (!disposed)
|
||||
@@ -39,6 +41,7 @@ namespace Axiom.Interpreter
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if(disposing)
|
||||
@@ -51,22 +54,28 @@ namespace Axiom.Interpreter
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
|
||||
public int ParseSymbolsCount
|
||||
{
|
||||
get{return parseSymbolCount;}
|
||||
}
|
||||
|
||||
public String LastMessage{ get; private set;}
|
||||
|
||||
public bool IsInError { get; private set;}
|
||||
|
||||
public bool ScanStrict
|
||||
{
|
||||
get{return scanStrict;}
|
||||
set{scanStrict=value;}
|
||||
}
|
||||
|
||||
public bool ParseStrict
|
||||
{
|
||||
get{return parseStrict;}
|
||||
set{parseStrict=value;}
|
||||
}
|
||||
|
||||
public bool Trace
|
||||
{
|
||||
get {return trace;}
|
||||
@@ -77,6 +86,7 @@ namespace Axiom.Interpreter
|
||||
get { return useCache; }
|
||||
set { useCache = value; }
|
||||
}
|
||||
|
||||
public String GetValue(String name)
|
||||
{
|
||||
if (!symbolTable.ContainsKey(name)) return "null";
|
||||
@@ -85,6 +95,7 @@ namespace Axiom.Interpreter
|
||||
if (null == genericData || genericData.IsNull()) return "null";
|
||||
return genericData.Get<String>();
|
||||
}
|
||||
|
||||
public T GetValue<T>(String name)
|
||||
{
|
||||
if(!symbolTable.ContainsKey(name)) return default(T);
|
||||
@@ -93,20 +104,24 @@ namespace Axiom.Interpreter
|
||||
if(null==genericData||genericData.IsNull()) return default(T);
|
||||
return genericData.Get<T>();
|
||||
}
|
||||
|
||||
public SymbolTable SymbolTable
|
||||
{
|
||||
get {return symbolTable;}
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
if (null == symbolTable) return;
|
||||
symbolTable.Reset();
|
||||
}
|
||||
|
||||
public bool Execute(DataTable dataTable, int row, String expression)
|
||||
{
|
||||
Reset();
|
||||
return ExecuteExpressionOnRow(dataTable, row, expression);
|
||||
}
|
||||
|
||||
private bool ExecuteExpressionOnRow(DataTable dataTable, int row, String expression)
|
||||
{
|
||||
symbolTable.AddUserSymbols(dataTable); // add symbol names from the data table columns
|
||||
@@ -121,6 +136,13 @@ namespace Axiom.Interpreter
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Execute - Executes the given expression. You can then use the helper methods.
|
||||
/// GetValue(String), GetValue<T>(String) to retrieve resulting variables from the symbolTable
|
||||
/// </summary>
|
||||
/// <param name="expression"></param>
|
||||
/// <returns></returns>
|
||||
public bool Execute(String expression)
|
||||
{
|
||||
BinaryReader binaryReader = null;
|
||||
@@ -142,7 +164,7 @@ namespace Axiom.Interpreter
|
||||
{
|
||||
LastMessage="Failed to scan the input document, possible invalid character sequence.";
|
||||
IsInError=true;
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, LastMessage);
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,LastMessage);
|
||||
return false;
|
||||
}
|
||||
binaryWriter.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||
@@ -156,7 +178,7 @@ namespace Axiom.Interpreter
|
||||
{
|
||||
LastMessage=String.Format("Failed to parse the input, {0} at {1}", parser.LastMessage, parser.LastLineNumber);
|
||||
IsInError=true;
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, LastMessage);
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,LastMessage);
|
||||
return false;
|
||||
}
|
||||
parserWriter.BaseStream.Seek(0, SeekOrigin.Begin); // SEEK TO THE BEGINNING OF THE CODE
|
||||
@@ -168,7 +190,7 @@ namespace Axiom.Interpreter
|
||||
{
|
||||
LastMessage=String.Format("Error: Failed to run the assembler, {0}", assembler.LastMessage);
|
||||
IsInError=true;
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, LastMessage);
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,LastMessage);
|
||||
return false;
|
||||
}
|
||||
if (Trace) DumpSymbolTable();
|
||||
@@ -180,7 +202,7 @@ namespace Axiom.Interpreter
|
||||
{
|
||||
LastMessage=String.Format("Exception:{0}",exception.ToString());
|
||||
IsInError=true;
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, LastMessage);
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,LastMessage);
|
||||
return false;
|
||||
}
|
||||
finally
|
||||
@@ -194,6 +216,11 @@ namespace Axiom.Interpreter
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disassemble - This method does not execute code. It scans, parses, and disassembles the geenrated bytecode
|
||||
/// </summary>
|
||||
/// <param name="expression"></param>
|
||||
/// <returns></returns>
|
||||
public List<String> Disassemble(String expression)
|
||||
{
|
||||
BinaryReader binaryReader = null;
|
||||
@@ -208,22 +235,22 @@ namespace Axiom.Interpreter
|
||||
{
|
||||
IsInError=false;
|
||||
LastMessage="";
|
||||
symbolTable = new SymbolTable();
|
||||
SymbolTable localSymbolTable = new SymbolTable();
|
||||
binaryReader = new BinaryReader(Utility.StreamFromString(expression));
|
||||
binaryWriter = new BinaryWriter(new MemoryStream());
|
||||
Scanner scanner = new Scanner(binaryReader, binaryWriter, symbolTable);
|
||||
Scanner scanner = new Scanner(binaryReader, binaryWriter, localSymbolTable);
|
||||
scanner.Debug = Trace;
|
||||
if (!scanner.Analyze())
|
||||
{
|
||||
LastMessage="Failed to scan the input document, possible invalid character sequence.";
|
||||
IsInError=true;
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, LastMessage);
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,LastMessage);
|
||||
return disassembly;
|
||||
}
|
||||
binaryWriter.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||
parserReader = new BinaryReader(binaryWriter.BaseStream);
|
||||
parserWriter = new BinaryWriter(new MemoryStream());
|
||||
Parser parser = new Parser(parserReader, parserWriter, symbolTable);
|
||||
Parser parser = new Parser(parserReader, parserWriter, localSymbolTable);
|
||||
parser.Debug = Trace;
|
||||
parser.Parse();
|
||||
parseSymbolCount=parser.ParseSymbolsCount;
|
||||
@@ -231,12 +258,12 @@ namespace Axiom.Interpreter
|
||||
{
|
||||
LastMessage=String.Format("Failed to parse the input, {0} at {1}", parser.LastMessage, parser.LastLineNumber);
|
||||
IsInError=true;
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, LastMessage);
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,LastMessage);
|
||||
return disassembly;
|
||||
}
|
||||
parserWriter.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||
assemblerReader = new BinaryReader(parserWriter.BaseStream);
|
||||
assembler = new Assembler(assemblerReader, symbolTable);
|
||||
assembler = new Assembler(assemblerReader, localSymbolTable);
|
||||
assembler.Debug = Trace;
|
||||
return assembler.Disassemble();
|
||||
}
|
||||
@@ -244,7 +271,7 @@ namespace Axiom.Interpreter
|
||||
{
|
||||
LastMessage=String.Format("Exception:{0}",exception.ToString());
|
||||
IsInError=true;
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, LastMessage);
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,LastMessage);
|
||||
return disassembly;
|
||||
}
|
||||
finally
|
||||
@@ -258,7 +285,6 @@ namespace Axiom.Interpreter
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// The cache will not work as effectively if the expression variables are not loaded directly into the SymbolTable
|
||||
public bool ApplyRuleWithCache(String expression)
|
||||
{
|
||||
@@ -304,6 +330,7 @@ namespace Axiom.Interpreter
|
||||
if (null != assembler) { assembler.Dispose(); }
|
||||
}
|
||||
}
|
||||
|
||||
public AxiomResult SyntaxCheck(String expression)
|
||||
{
|
||||
BinaryReader binaryReader = null;
|
||||
@@ -353,6 +380,7 @@ namespace Axiom.Interpreter
|
||||
if (null != parserWriter) { parserWriter.Close(); parserWriter.Dispose(); }
|
||||
}
|
||||
}
|
||||
|
||||
private Stream Compile(String expression, bool includeCodeEnd = true)
|
||||
{
|
||||
BinaryReader binaryReader = null;
|
||||
@@ -407,6 +435,7 @@ namespace Axiom.Interpreter
|
||||
if (null != parserReader) { parserReader.Close();parserReader.Dispose(); }
|
||||
}
|
||||
}
|
||||
|
||||
private void DumpSymbolTable()
|
||||
{
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,"********************************************************* O U T P U T ************************************************");
|
||||
|
||||
Reference in New Issue
Block a user