Beispiel #1
0
        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));
                }
            }
        }