public CodeBlock GetLines(int startIndex, int endIndex, List <SourceLine> lines, out ParseError error, SourceLineDirective parent) { CodeBlock block = new CodeBlock(parent); SourceLineDirective sourceLineDirective = null; bool isSeekingEnd = false; bool startRequired = false; int openedIndex = 0; int seekLevel = 0; int currentLevel = 0; for (int i = startIndex; i < endIndex; i++) { if (SourceLineDirective.IsDirective(lines[i].Input)) { if (isSeekingEnd) { continue; } if (startRequired) { error = new ParseError(ParseErrorType.Directives_StartOfCodeBlockExpected, lines[i].LineIndex, lines[i].FileName); return(null); } var dir = new SourceLineDirective(lines[i]); error = dir.Parse(); if (error != null) { return(null); } lines[i] = dir.Cast(out error); if (error != null) { return(null); } var directive = (lines[i] as SourceLineDirective); if (directive.RequireCodeBlock) { directive.CodeBlock = block; sourceLineDirective = directive; startRequired = true; } else { block.ChildBlocks.Add(new CodeBlock(directive)); } } else if (SourceLineCodeBlockLimiter.IsCodeBlockLimiter(lines[i].Input)) { var lim = new SourceLineCodeBlockLimiter(lines[i]); error = lim.Parse(); if (error != null) { return(null); } lines[i] = lim; if (lim.IsOpening) { if (!isSeekingEnd) { if (!startRequired) { error = new ParseError(ParseErrorType.Directives_StartOfCodeBlockIsUnexpected, lines[i].LineIndex, lines[i].FileName); return(null); } seekLevel = currentLevel; openedIndex = i; isSeekingEnd = true; startRequired = false; } currentLevel++; } else { if (startRequired) { error = new ParseError(ParseErrorType.Directives_StartOfCodeBlockExpected, lines[i].LineIndex, lines[i].FileName); return(null); } if (isSeekingEnd && currentLevel - 1 == seekLevel) { sourceLineDirective.CodeBlock.ChildBlocks.Add(GetLines(openedIndex + 1, i, lines, out error, sourceLineDirective)); if (error != null) { return(null); } isSeekingEnd = false; startRequired = false; } if (currentLevel == 0) { error = new ParseError(ParseErrorType.Directives_EndOfCodeBlockIsunexpected, lines[i].LineIndex, lines[i].FileName); return(null); } currentLevel--; } } else { if (startRequired) { error = new ParseError(ParseErrorType.Directives_StartOfCodeBlockExpected, lines[i].LineIndex, lines[i].FileName); return(null); } if (isSeekingEnd) { continue; } if (!lines[i].IsEmpty) { block.RawLines.Add(lines[i]); } } } if (startRequired) { error = new ParseError(ParseErrorType.Directives_StartOfCodeBlockExpected, lines[endIndex - 1].LineIndex, lines[endIndex - 1].FileName); return(null); } if (isSeekingEnd) { error = new ParseError(ParseErrorType.Directives_EndOfCodeBlockExpected, lines[endIndex - 1].LineIndex, lines[endIndex - 1].FileName); return(null); } error = null; return(block); }
public SourceLineDirectiveAssembly(SourceLineDirective line) : base(line) { Name = line.Name; Parameters = line.Parameters; RequireCodeBlock = true; }
public SourceLineDirectiveField(SourceLineDirective line) : base(line) { Name = line.Name; Parameters = line.Parameters; RequireCodeBlock = false; }
public CodeBlock(SourceLineDirective parent) { ParentDirective = parent; ChildBlocks = new List <CodeBlock>(); RawLines = new List <SourceLine>(); }