protected override void ProcessTimeCommand() { if (inTimeStamp) { throw DmlSyntaxError.BadTimeCommandPlacement(); } inTimeStamp = true; DmlSyntaxError badTimeCommand = DmlSyntaxError.BadTimeCommandSyntax(); double time, start = -1, end = -1; string timeCommand = CurrentToken; switch (timeCommand) { case "At": case "Before": case "After": SetExpecting(DmlTokens.LPAR, DmlTokens.NUMBER, DmlTokens.RPAR, DmlTokens.LANGLE); Advance(2, exception: badTimeCommand); time = Double.Parse(CurrentToken); Advance(2, exception: badTimeCommand); if (timeCommand == "At") { currentTimestamp = new TimestampAt(time); } else if (timeCommand == "Before") { currentTimestamp = new TimestampBefore(time); } else { currentTimestamp = new TimestampAfter(time); } break; case "AtIntervals": case "DuringIntervals": SetExpecting(DmlTokens.LPAR, DmlTokens.NUMBER); Advance(2, exception: badTimeCommand); time = Double.Parse(CurrentToken); if (DmlTokens.IsMatch(NextToken, DmlTokens.COMMA)) { SetExpecting(DmlTokens.COMMA, DmlTokens.NUMBER); Advance(2, exception: badTimeCommand); start = Double.Parse(CurrentToken); SetExpecting(DmlTokens.COMMA, DmlTokens.NUMBER); Advance(2, exception: badTimeCommand); end = Double.Parse(CurrentToken); } SetExpecting(DmlTokens.RPAR, DmlTokens.LANGLE); Advance(2, exception: badTimeCommand); if (timeCommand == "AtIntervals") { if (start == -1) { currentTimestamp = new TimestampAtIntervals(time); } else { currentTimestamp = new TimestampAtIntervals(time, start, end); } } else { if (start == -1) { currentTimestamp = new TimestampDuringIntervals(time); } else { currentTimestamp = new TimestampDuringIntervals(time, start, end); } } break; case "From": SetExpecting( DmlTokens.LPAR, DmlTokens.NUMBER, DmlTokens.COMMA, DmlTokens.NUMBER, DmlTokens.RPAR, DmlTokens.LANGLE ); Advance(2, exception: badTimeCommand); start = Double.Parse(CurrentToken); Advance(2, exception: badTimeCommand); end = Double.Parse(CurrentToken); Advance(2, exception: badTimeCommand); currentTimestamp = new TimestampFrom(start, end); break; } Advance(exception: badTimeCommand); int angleDepth = 0; while (!Done) { if (DmlTokens.IsMatch(CurrentToken, DmlTokens.LANGLE)) { angleDepth++; } else if (DmlTokens.IsMatch(CurrentToken, DmlTokens.RANGLE)) { if (angleDepth == 0) { break; } angleDepth--; } ParseNext(); } currentTimestamp.SetCode(new CodeBlock(Instructions.ToArray())); Instructions = new List <Instruction>(); timeline.AddTimestamp(currentTimestamp); inTimeStamp = false; }
protected override void ProcessTimeCommand() { if (inTimeStamp) throw DmlSyntaxError.BadTimeCommandPlacement(); inTimeStamp = true; DmlSyntaxError badTimeCommand = DmlSyntaxError.BadTimeCommandSyntax(); double time, start = -1, end = -1; string timeCommand = CurrentToken; switch (timeCommand) { case "At": case "Before": case "After": SetExpecting(DmlTokens.LPAR, DmlTokens.NUMBER, DmlTokens.RPAR, DmlTokens.LANGLE); Advance(2, exception: badTimeCommand); time = Double.Parse(CurrentToken); Advance(2, exception: badTimeCommand); if (timeCommand == "At") currentTimestamp = new TimestampAt(time); else if (timeCommand == "Before") currentTimestamp = new TimestampBefore(time); else currentTimestamp = new TimestampAfter(time); break; case "AtIntervals": case "DuringIntervals": SetExpecting(DmlTokens.LPAR, DmlTokens.NUMBER); Advance(2, exception: badTimeCommand); time = Double.Parse(CurrentToken); if (DmlTokens.IsMatch(NextToken, DmlTokens.COMMA)) { SetExpecting(DmlTokens.COMMA, DmlTokens.NUMBER); Advance(2, exception: badTimeCommand); start = Double.Parse(CurrentToken); SetExpecting(DmlTokens.COMMA, DmlTokens.NUMBER); Advance(2, exception: badTimeCommand); end = Double.Parse(CurrentToken); } SetExpecting(DmlTokens.RPAR, DmlTokens.LANGLE); Advance(2, exception: badTimeCommand); if (timeCommand == "AtIntervals") { if (start == -1) currentTimestamp = new TimestampAtIntervals(time); else currentTimestamp = new TimestampAtIntervals(time, start, end); } else { if (start == -1) currentTimestamp = new TimestampDuringIntervals(time); else currentTimestamp = new TimestampDuringIntervals(time, start, end); } break; case "From": SetExpecting( DmlTokens.LPAR, DmlTokens.NUMBER, DmlTokens.COMMA, DmlTokens.NUMBER, DmlTokens.RPAR, DmlTokens.LANGLE ); Advance(2, exception: badTimeCommand); start = Double.Parse(CurrentToken); Advance(2, exception: badTimeCommand); end = Double.Parse(CurrentToken); Advance(2, exception: badTimeCommand); currentTimestamp = new TimestampFrom(start, end); break; } Advance(exception: badTimeCommand); int angleDepth = 0; while (!Done) { if (DmlTokens.IsMatch(CurrentToken, DmlTokens.LANGLE)) angleDepth++; else if (DmlTokens.IsMatch(CurrentToken, DmlTokens.RANGLE)) { if (angleDepth == 0) break; angleDepth--; } ParseNext(); } currentTimestamp.SetCode(new CodeBlock(Instructions.ToArray())); Instructions = new List<Instruction>(); timeline.AddTimestamp(currentTimestamp); inTimeStamp = false; }