예제 #1
0
파일: Machine.cs 프로젝트: ckyame/Compiler
        public void Parse(string code)
        {
            List <string> chunked   = code.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
            List <string> processed = new List <string>();

            chunked.ForEach(chunk => processed.Add(chunk.TrimStart()));
            List <string> headerChunks   = processed[0].Split(' ').Where(chunk => chunk != "").ToList();
            string        varExpectation = processed[1].Trim();
            string        declarations   = processed[2].Trim();
            int           beginIndex     = processed.IndexOf("BEGIN");
            int           endIndex       = processed.IndexOf("END");

            if (ProcessHeader(headerChunks))
            {
                if (LOADEDMEMORY.Process(varExpectation, CPP) && LOADEDMEMORY.Process(declarations, CPP))
                {
                    if (LOGICBEGIN.Process(processed[beginIndex], CPP) || LOGICEND.Process(processed[endIndex], CPP))
                    {
                        for (int i = beginIndex + 1; i < endIndex; i++)
                        {
                            if (LOGICBLOCK.Process(processed[i], CPP))
                            {
                            }
                            else
                            {
                                CPP.Clear();
                                Machine.OnStateProcessedFailed("Error in logic block.");
                            }
                        }
                    }
                    else
                    {
                        CPP.Clear();
                        Machine.OnStateProcessedFailed("Invalid Logic Control.");
                    }
                }
                else
                {
                    CPP.Clear();
                    Machine.OnStateProcessedFailed("Error near declarations.");
                }
            }
            else
            {
                CPP.Clear();
                Machine.OnStateProcessedFailed("Header of code invalid.");
            }
            CPP.Append("}");
            Machine.OnParseSuccessful();
        }
예제 #2
0
 public override bool Process(string fragment, StringBuilder cpp)
 {
     Machine.OnStateProcessed(SYMBOL);
     return(S_STAT.Process(fragment, cpp));
 }