204 lines
6.6 KiB
C#
Executable File
204 lines
6.6 KiB
C#
Executable File
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Axiom.Utils;
|
|
|
|
// FileName : Emitter.cs
|
|
// Author : Sean Kessler
|
|
|
|
namespace Axiom.Interpreter
|
|
{
|
|
public class 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)MDTrace.WriteLine(LogLevel.DEBUG,Scanner.SymbolToString(code));
|
|
}
|
|
public void Emit(Scanner.ScanSymbols code,int value)
|
|
{
|
|
if (!emitting) return;
|
|
outputStream.Write((int)code);
|
|
outputStream.Write(value);
|
|
if(Debug)MDTrace.WriteLine(LogLevel.DEBUG,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)MDTrace.WriteLine(LogLevel.DEBUG,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)MDTrace.WriteLine(LogLevel.DEBUG,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)MDTrace.WriteLine(LogLevel.DEBUG,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)MDTrace.WriteLine(LogLevel.DEBUG,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)MDTrace.WriteLine(LogLevel.DEBUG,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)MDTrace.WriteLine(LogLevel.DEBUG,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)MDTrace.WriteLine(LogLevel.DEBUG,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;
|
|
}
|
|
}
|
|
}
|
|
}
|