Enable processing of For Loops.

This commit is contained in:
2026-03-19 16:23:20 -04:00
parent 4d7d246431
commit f3c4a1b537
12 changed files with 608 additions and 149 deletions

View File

@@ -29,10 +29,12 @@ namespace Axiom.Interpreter
symbolTable=new SymbolTable();
IsInError=false;
}
~CodeRunner()
{
Dispose(false);
}
public void Dispose()
{
if (!disposed)
@@ -41,6 +43,7 @@ namespace Axiom.Interpreter
GC.SuppressFinalize(this);
}
}
protected virtual void Dispose(bool disposing)
{
if(disposing)
@@ -53,32 +56,40 @@ 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;}
set {trace=value;}
}
public bool UseCache
{
get { return useCache; }
set { useCache = value; }
}
public String GetValue(String name)
{
if (!symbolTable.ContainsKey(name)) return "null";
@@ -87,6 +98,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);
@@ -95,20 +107,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
@@ -123,6 +139,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;
@@ -161,7 +184,7 @@ namespace Axiom.Interpreter
logger.ErrorFormat(LastMessage);
return false;
}
parserWriter.BaseStream.Seek(0, SeekOrigin.Begin);
parserWriter.BaseStream.Seek(0, SeekOrigin.Begin); // SEEK TO THE BEGINNING OF THE CODE
assemblerReader = new BinaryReader(parserWriter.BaseStream);
assembler = new Assembler(assemblerReader, symbolTable);
assembler.Debug = Trace;
@@ -196,6 +219,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;
@@ -210,9 +238,10 @@ namespace Axiom.Interpreter
{
IsInError=false;
LastMessage="";
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())
{
@@ -224,7 +253,7 @@ namespace Axiom.Interpreter
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;
@@ -237,7 +266,7 @@ namespace Axiom.Interpreter
}
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();
}
@@ -412,7 +441,7 @@ namespace Axiom.Interpreter
{
logger.Info("********************************************************* O U T P U T ************************************************");
List<Symbol> list = new List<Symbol>(symbolTable.Values);
list = (from Symbol symbol in list where symbol.TypeOfSymbol.Equals(Symbol.SymbolType.UserSymbol) select symbol).ToList();
// list = (from Symbol symbol in list where symbol.TypeOfSymbol.Equals(Symbol.SymbolType.UserSymbol) select symbol).ToList();
foreach (Symbol symbol in list)
{
logger.Info(String.Format("SYMBOL NAME:'{0}',VALUE:'{1}'", symbol.SymbolName, null == symbol.GenericData ? "<null>" : symbol.GenericData.ToString()));