|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Anonymus.Recognizers
{
public abstract class KeywordFuncRecognizer
{
public abstract ExprRecognizerRes Recognize(PString Code, List<PString> Params,
ExprPlugIn PlugIn, ref ExpressionNode Ret);
}
public class IsDefinedRecognizer : KeywordFuncRecognizer
{
public override ExprRecognizerRes Recognize(PString Code, List<PString> Params,
ExprPlugIn PlugIn, ref ExpressionNode Ret)
{
if (Params[0].String == "defined")
{
if (Params.Count != 2)
{
PlugIn.State.Messages.Add(MessageId.ParamCount, Code);
return ExprRecognizerRes.Failed;
}
else
{
var Defined = PlugIn.PreState.GetMacro(Params[1].String) != null;
Ret = Expressions.GetBoolValue(PlugIn.Container, Defined, Code);
if (Ret == null) return ExprRecognizerRes.Failed;
return ExprRecognizerRes.Succeeded;
}
}
return ExprRecognizerRes.UnknownOp;
}
}
public class SizeOfRecognizer : KeywordFuncRecognizer
{
public override ExprRecognizerRes Recognize(PString Code, List<PString> Params,
ExprPlugIn PlugIn, ref ExpressionNode Ret)
{
if (Params[0].String == "sizeof")
{
var State = PlugIn.State;
if (Params.Count != 2)
{
State.Messages.Add(MessageId.ParamCount, Code);
return ExprRecognizerRes.Failed;
}
else
{
var Container = PlugIn.Container;
var RetVal = -1;
var Id = Container.GetId<Identifier>(Params[1]);
if (Id == null) return ExprRecognizerRes.Failed;
if (Id is Type) RetVal = (Id as Type).Size;
else if (Id is Variable) RetVal = (Id as Variable).Type.Size;
if (RetVal == -1)
{
State.Messages.Add(MessageId.CannotGetSize, Params[1]);
return ExprRecognizerRes.Failed;
}
Ret = Expressions.GetIntValue(PlugIn.Container, RetVal, Code);
return ExprRecognizerRes.Succeeded;
}
}
return ExprRecognizerRes.UnknownOp;
}
}
public class MathFuncsRecognizer : KeywordFuncRecognizer
{
public override ExprRecognizerRes Recognize(PString Code, List<PString> Params,
ExprPlugIn PlugIn, ref ExpressionNode Ret)
{
Operator Op;
var Func = Params[0].String;
if (Func == "abs") Op = Operator.Abs;
else if (Func == "sqrt") Op = Operator.Sqrt;
else if (Func == "sin") Op = Operator.Sin;
else if (Func == "cos") Op = Operator.Cos;
else if (Func == "tan") Op = Operator.Tan;
else if (Func == "atan") Op = Operator.ATan;
else if (Func == "atan2") Op = Operator.ATan2;
else if (Func == "asin") Op = Operator.ASin;
else if (Func == "acos") Op = Operator.ACos;
else return ExprRecognizerRes.UnknownOp;
var ParamCount = 1;
if (Op == Operator.ATan2) ParamCount = 2;
var State = PlugIn.State;
if (Params.Count != ParamCount + 1)
{
State.Messages.Add(MessageId.ParamCount, Code);
return ExprRecognizerRes.Failed;
}
else
{
var Ch = new List<ExpressionNode>() { };
for (var i = 0; i < ParamCount; i++)
{
var Src = Expressions.Recognize(Params[i + 1], PlugIn, true);
if (Src == null) return ExprRecognizerRes.Failed;
Ch.Add(Src);
}
Ret = new OpExpressionNode(Op, Ch, Code);
return ExprRecognizerRes.Succeeded;
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.