static bool Check(CompilerState State, CodeString Code) { if (Code[0] == '(' && Code.GetBracketPos(State) == -1) { return(false); } if (Code[0] == ')') { State.Messages.Add(MessageId.ZNumErr, Code.Substring(0, 1)); return(false); } var P = Code.Length - 1; if (Code[P] == '(') { State.Messages.Add(MessageId.ZNumErr, Code.Substring(P)); return(false); } if (Code[P] == ')' && Code.GetBracketPos(State, true) == -1) { return(false); } return(true); }
public SimpleRecResult GetGenericParams(CompilerState State, ref CodeString Code, out CodeString[] Out, bool EnableMessages = true) { Out = null; if (Code.Length > 0 && Code[Code.Length - 1] == '>') { var BracketPos = Code.GetBracketPos(State, true); if (BracketPos == -1) { return(SimpleRecResult.Failed); } var ParamStart = BracketPos + 1; var StrParams = Code.TrimmedSubstring(State, ParamStart, Code.Length - ParamStart - 1); if (!StrParams.IsValid) { return(SimpleRecResult.Failed); } Out = RecognizerHelper.GetParamList(State, StrParams); if (Out == null) { return(SimpleRecResult.Failed); } Code = Code.Substring(0, BracketPos).Trim(); } return(SimpleRecResult.Unknown); }
public SimpleRecResult Recognize(IdContainer Container, CodeString Code, GetIdOptions Options, ref Identifier Ret) { var Position = Code.Length - 1; if (Position >= 0 && Code[Position] == ']') { var State = Container.State; var ZPos = Code.GetBracketPos(State, true, Options.EnableMessages); if (ZPos == -1) { return(SimpleRecResult.Failed); } var Left = Code.TrimmedSubstring(State, 0, ZPos, Options.EnableMessages); if (!Left.IsValid) { return(SimpleRecResult.Failed); } var TOptions = Options; TOptions.Func = x => x.RealId is Type; var TypeOfVals = Identifiers.Recognize(Container, Left, TOptions); if (TypeOfVals == null) { return(SimpleRecResult.Failed); } var RTypeOfVals = TypeOfVals.RealId as Type; if (RTypeOfVals == null || (RTypeOfVals.TypeFlags & TypeFlags.CanBeArrayType) == 0) { if (Options.EnableMessages) { State.Messages.Add(MessageId.UnknownId, Code); } return(SimpleRecResult.Failed); } var StrParams = Code.Substring(ZPos + 1, Position - ZPos - 1).Trim(); if (StrParams.IsEqual("?")) { Ret = new NonrefArrayType(Container, TypeOfVals, null); if (Options.Func == null || Options.Func(Ret)) { return(SimpleRecResult.Succeeded); } } else if (StrParams.IsEqual("*")) { if ((RTypeOfVals.TypeFlags & TypeFlags.CanBePointer) == 0) { if (Options.EnableMessages) { State.Messages.Add(MessageId.UnknownId, Code); } return(SimpleRecResult.Failed); } Ret = new PointerAndLength(Container, TypeOfVals); if (Options.Func == null || Options.Func(Ret)) { return(SimpleRecResult.Succeeded); } } var SplParams = RecognizerHelper.SplitToParameters(State, StrParams, ',', Options.EnableMessages, true); if (SplParams == null) { return(SimpleRecResult.Failed); } if (SplParams.Length == 0 || SplParams[0].Length == 0) { for (var i = 0; i < SplParams.Length; i++) { if (SplParams[i].Length > 0) { State.Messages.Add(MessageId.NotExpected, SplParams[i]); return(SimpleRecResult.Failed); } } var IndexCount = SplParams.Length == 0 ? 1 : SplParams.Length; Ret = new RefArrayType(Container, TypeOfVals, IndexCount); if (Options.Func == null || Options.Func(Ret)) { return(SimpleRecResult.Succeeded); } } else { var Plugin = Container.GetPlugin(); Plugin.GetPlugin <EvaluatorPlugin>().MustBeConst = true; var Lengths = new int[SplParams.Length]; for (var i = 0; i < SplParams.Length; i++) { var Node = Expressions.CreateExpression(SplParams[i], Plugin); var ConstCh = Node as ConstExpressionNode; if (ConstCh == null) { return(SimpleRecResult.Failed); } if (!(ConstCh.Type is NonFloatType)) { if (Options.EnableMessages) { State.Messages.Add(MessageId.MustBeInteger, StrParams); } return(SimpleRecResult.Failed); } if (!VerifyArrayLength(State, ConstCh, StrParams, Options.EnableMessages)) { return(SimpleRecResult.Failed); } Lengths[i] = (int)ConstCh.Integer; } Ret = new NonrefArrayType(Container, TypeOfVals, Lengths); if (Options.Func == null || Options.Func(Ret)) { return(SimpleRecResult.Succeeded); } } } return(SimpleRecResult.Unknown); }
public SimpleRecResult Recognize(IdContainer Container, CodeString Code, GetIdOptions Options, ref Identifier Ret) { if (Code.StartsWith(Operators, Skip, IdCharCheck: new IdCharCheck(true)).Index == 0) { var State = Container.State; if (Code[Code.Length - 1] != ')') { if (Options.EnableMessages) { State.Messages.Add(MessageId.NotExpected, Code); } return(SimpleRecResult.Failed); } var BracketPos = Code.GetBracketPos(State, true, Options.EnableMessages); if (BracketPos == -1) { return(SimpleRecResult.Failed); } var Left = Code.TrimmedSubstring(State, 3, BracketPos - 3, Options.EnableMessages); if (!Left.IsValid) { return(SimpleRecResult.Failed); } CallingConvention CallConv; if (!Modifiers.GetCallConv(Container, ref Left, out CallConv)) { return(SimpleRecResult.Failed); } if (CallConv == CallingConvention.Unknown) { CallConv = Container.DefaultCallConv; } var TOptions = Options; TOptions.Func = x => x.RealId is Type; var RetType = Identifiers.Recognize(Container, Left, TOptions); var StrParams = Code.Substring(BracketPos + 1, Code.Length - BracketPos - 2).Trim(); var Flags = VarDeclarationListFlags.EnableUnnamed | VarDeclarationListFlags.EnableInitValue; if (Options.EnableMessages) { Flags |= VarDeclarationListFlags.EnableMessages; } var DeclList = VarDeclarationList.Create(Container, StrParams, null, Flags); if (DeclList == null || RetType == null) { return(SimpleRecResult.Failed); } if (!(RetType.RealId is Type)) { State.Messages.Add(MessageId.UnknownType, Left); return(SimpleRecResult.Failed); } var Params = DeclList.ToFuncParams(Container.GetPlugin()); if (Params == null || Params.Contains(null)) { return(SimpleRecResult.Failed); } Ret = new TypeOfFunction(Container, CallConv, RetType, Params); if (Options.Func == null || Options.Func(Ret)) { return(SimpleRecResult.Succeeded); } } return(SimpleRecResult.Unknown); }