Initial Commit

This commit is contained in:
2025-03-25 21:38:29 -04:00
parent fe2a36bb19
commit c266eecfeb
77 changed files with 347700 additions and 0 deletions

View File

@@ -0,0 +1,204 @@
using System;
using System.IO;
using System.Linq;
using log4net;
// FileName : Emitter.cs
// Author : Sean Kessler
namespace Axiom.Interpreter
{
public class Emitter
{
private static ILog logger = LogManager.GetLogger(typeof(Emitter));
private bool emitting = true;
private int lastSymbol;
private BinaryReader inputStream;
private BinaryWriter outputStream;
private bool debug = true;
public Emitter(BinaryReader inputStream, BinaryWriter outputStream)
{
this.inputStream = inputStream;
this.outputStream = outputStream;
}
public bool Debug
{
get { return debug; }
set { debug = value; }
}
public void Emit(String literalValue)
{
if (!emitting) return;
outputStream.Write(literalValue.Length);
outputStream.Write(literalValue);
}
// ************************************************************************
public void Emit(Scanner.ScanSymbols code)
{
if (!emitting) return;
outputStream.Write((int)code);
if(Debug)logger.Info(Scanner.SymbolToString(code));
}
public void Emit(Scanner.ScanSymbols code,int value)
{
if (!emitting) return;
outputStream.Write((int)code);
outputStream.Write(value);
if(Debug)logger.Info(Scanner.SymbolToString(code)+","+value.ToString());
}
public void Emit(Scanner.ScanSymbols code,double value)
{
if (!emitting) return;
outputStream.Write((int)code);
outputStream.Write(value);
if(Debug)logger.Info(Scanner.SymbolToString(code)+","+value.ToString());
}
public void Emit(Scanner.ScanSymbols code,String value)
{
if (!emitting) return;
outputStream.Write((int)code);
outputStream.Write(value);
if(Debug)logger.Info(Scanner.SymbolToString(code)+","+value.ToString());
}
// **********************************************************************************************************************************************
public long CodePointer()
{
return outputStream.BaseStream.Position;
}
public void Seek(long position)
{
outputStream.BaseStream.Seek(position, SeekOrigin.Begin);
}
public void Emit(Parser.ParserSymbols code)
{
if (!emitting) return;
long positionBefore=outputStream.BaseStream.Position;
outputStream.Write((int)code);
long positionAfter=outputStream.BaseStream.Position;
if(Debug)logger.Info(Parser.SymbolToString(code)+"["+positionBefore+","+positionAfter+"]");
}
public void Emit(Parser.ParserSymbols code,Object value)
{
if (!emitting) return;
long positionBefore=outputStream.BaseStream.Position;
outputStream.Write((int)code);
Type type = value.GetType();
outputStream.Write(type.ToString());
outputStream.Write(value.ToString());
long positionAfter=outputStream.BaseStream.Position;
if(Debug)logger.Info(Parser.SymbolToString(code)+","+type.ToString()+","+value.ToString()+"["+positionBefore+","+positionAfter+"]");
}
public void Emit(Parser.ParserSymbols code,Object value,int intValue)
{
if (!emitting) return;
long positionBefore=outputStream.BaseStream.Position;
outputStream.Write((int)code);
Type type = value.GetType();
outputStream.Write(type.ToString());
outputStream.Write(value.ToString());
outputStream.Write(intValue);
long positionAfter=outputStream.BaseStream.Position;
if(Debug)logger.Info(Parser.SymbolToString(code)+","+type.ToString()+","+value.ToString()+","+intValue+"["+positionBefore+","+positionAfter+"]");
}
public void Emit(Parser.ParserSymbols code,long value)
{
if (!emitting) return;
long positionBefore=outputStream.BaseStream.Position;
outputStream.Write((int)code);
outputStream.Write(value);
long positionAfter=outputStream.BaseStream.Position;
if(Debug)logger.Info(Parser.SymbolToString(code)+","+value.ToString()+","+value.ToString()+"["+positionBefore+","+positionAfter+"]");
}
public void EmitAsNull(Parser.ParserSymbols code)
{
if (!emitting) return;
long positionBefore=outputStream.BaseStream.Position;
outputStream.Write((int)code);
Type type = typeof(System.Nullable); //value.GetType();
outputStream.Write(type.ToString());
outputStream.Write("null".ToString());
long positionAfter=outputStream.BaseStream.Position;
if(Debug)logger.Info(Parser.SymbolToString(code)+","+type.ToString()+","+"null".ToString()+"["+positionBefore+","+positionAfter+"]");
}
// ************************************************************************
public void Emit(int code, int op)
{
if (!emitting) return;
outputStream.Write(code);
outputStream.Write(op);
}
public void Emit(int identifier)
{
if (!emitting) return;
outputStream.Write(identifier);
}
public void Emit(byte value)
{
if (!emitting) return;
outputStream.Write(value);
}
public int Peek(ref int value)
{
value = inputStream.PeekChar();
return value;
}
public int Peek()
{
int value = inputStream.PeekChar();
return value;
}
public int PeekIgnore(ref int value,int[] ignoreChars)
{
long streamPosition=inputStream.BaseStream.Position;
while(true)
{
int readValue;
readValue=(int)inputStream.ReadChar();
value=readValue;
if(!ignoreChars.Any(x=>x.Equals(readValue)))break;
}
inputStream.BaseStream.Seek(streamPosition,SeekOrigin.Begin);
return value;
}
public int Read()
{
lastSymbol = inputStream.Read();
return lastSymbol;
}
public int Read(ref String literal)
{
literal=inputStream.ReadString();
return 0;
}
public int Read(ref byte value)
{
try { value = inputStream.ReadByte(); return 0; }
catch (EndOfStreamException) { return 0xFFFF; }
}
public int Read(ref int value)
{
try { value = inputStream.ReadInt32(); return 0; }
catch (EndOfStreamException) { return 0xFFFF; }
}
public int Read(ref double value)
{
try { value = inputStream.ReadDouble(); return 0; }
catch (EndOfStreamException) { return 0xFFFF; }
}
public bool Emitting
{
get
{
return emitting;
}
set
{
emitting = value;
}
}
}
}