public static Semanteme[] ProcessLines(IEnumerable <string> lines) { ArgumentUtils.ClearAlias(); var semantemes = new List <Semanteme>(); bool insideComment = false; uint lineNumber = 0; foreach (string entry in lines) { string line = entry.Trim(); lineNumber++; int index; index = SearchStringIndex(line, "//"); if (index >= 0) { // strip single line comments line = line.Substring(0, index); } if (insideComment) { index = SearchStringIndex(line, "*/"); if (index == -1) { continue; } line = line.Substring(index + 2); } index = 0; while (true) { index = SearchStringIndex(line, "/*", index); if (index == -1) { break; } int index2 = SearchStringIndex(line, "*/", index + 2); if (index2 >= 0) { line = line.Substring(0, index) + line.Substring(index2 + 2); } else { line = line.Substring(0, index); insideComment = true; break; } } index = SearchStringIndex(line, ":"); if (index >= 0) { semantemes.Add(new Label(lineNumber, line.Substring(0, index).AsLabel())); line = line.Substring(index + 1).Trim(); } if (!string.IsNullOrEmpty(line)) { string[] words = SplitWords(line); var name = words[0]; var args = words.Skip(1).ToArray(); semantemes.Add(new Instruction(lineNumber, name, args)); } } return(semantemes.ToArray()); }
public static IEnumerable <Semanteme> ProcessLines(IEnumerable <string> lines) { ArgumentUtils.ClearAlias(); bool isInComment = false; uint lineNumber = 0; foreach (string line in lines) { string pline = line; ++lineNumber; int index; if (isInComment) { index = pline.IndexOf("*/", StringComparison.Ordinal); if (index == -1) { continue; } pline = pline.Substring(index + 2); } index = 0; while (true) { index = pline.IndexOf("/*", index, StringComparison.Ordinal); if (index == -1) { break; } int index2 = pline.IndexOf("*/", index + 2, StringComparison.Ordinal); if (index2 >= 0) { pline = pline.Substring(0, index) + pline.Substring(index2 + 2); } else { pline = pline.Substring(0, index); isInComment = true; break; } } index = pline.IndexOf("//", StringComparison.Ordinal); if (index >= 0) { pline = pline.Substring(0, index); } pline = pline.Trim(); index = pline.IndexOf(':'); if (index >= 0) { yield return(new Label(lineNumber, pline.Substring(0, index).AsLabel())); pline = pline.Substring(index + 1).Trim(); } if (!string.IsNullOrEmpty(pline)) { //string[] words = pline.Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); string[] words = SplitWords(pline); var name = words[0]; var args = words.Skip(1).ToArray(); yield return(new Instruction(lineNumber, name, args)); } } }