コード例 #1
0
        public List <GPCSymbolObject> Parser()
        {
            int              end           = 0;
            int              i             = 0;
            GPCSymbolItem    rCurSymbol    = null;
            GPCSymbolElement rCurElem      = null;
            GPCSymbolObject  rCurSymbolObj = null;

            List <GPCSymbolObject> rSymbolObjs = new List <GPCSymbolObject>();
            Stack <GPCSymbolItem>  rNodeStack  = new Stack <GPCSymbolItem>();

            while (i < this.originData.Length)
            {
                if (!string.IsNullOrEmpty(LexicalAnalysis.isSpecialSymbol(originData, i, ref end)) || !string.IsNullOrEmpty(LexicalAnalysis.isComment(originData, i, ref end)))
                {
                    i = end;
                    continue;
                }
                rCurSymbol = buildSymbolItem(rCurSymbol, i, ref end);
                if (rCurSymbol != null)
                {
                    switch (rCurSymbol.Type)
                    {
                    case GPCSymbolType.ObjStart:
                        rCurSymbolObj        = new GPCSymbolObject();
                        rCurSymbolObj.Head   = new GPCSymbolElement(rCurElem.Identifer, rCurElem.Args);
                        rCurSymbolObj.Bodies = new List <GPCSymbolElement>();
                        break;

                    case GPCSymbolType.ObjEnd:
                        rSymbolObjs.Add(rCurSymbolObj);
                        rCurSymbolObj = null;
                        break;

                    case GPCSymbolType.ArgsStart:
                        GPCSymbolItem rPeekNode = rNodeStack.Pop();
                        rCurElem           = new GPCSymbolElement();
                        rCurElem.Identifer = rPeekNode;
                        rCurElem.Args      = new List <GPCSymbolItem>();
                        break;

                    case GPCSymbolType.ArgsEnd:
                        GPCSymbolItem rPeekNode1 = rNodeStack.Pop();
                        rCurElem.Args.Add(rPeekNode1);
                        break;

                    case GPCSymbolType.ArgsSplit:
                        GPCSymbolItem rPeekNode2 = rNodeStack.Pop();
                        rCurElem.Args.Add(rPeekNode2);
                        break;

                    case GPCSymbolType.ElementSplit:
                        rCurSymbolObj.Bodies.Add(rCurElem);
                        rCurElem = null;
                        break;

                    case GPCSymbolType.Identifer:
                        rNodeStack.Push(rCurSymbol);
                        break;

                    case GPCSymbolType.Arg:
                        rNodeStack.Push(rCurSymbol);
                        break;

                    default:
                        break;
                    }
                    i = end;
                    continue;
                }
                i++;
            }
            return(rSymbolObjs);
        }
コード例 #2
0
        private GPCSymbolItem buildSymbolItem(GPCSymbolItem rCurSymbol, int begin, ref int end)
        {
            if (originData[begin] == '{')
            {
                end = begin + 1;
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.ObjStart, Value = "{"
                });
            }
            else if (originData[begin] == '}')
            {
                end = begin + 1;
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.ObjEnd, Value = "}"
                });
            }
            else if (originData[begin] == '(')
            {
                end = begin + 1;
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.ArgsStart, Value = "("
                });
            }
            else if (originData[begin] == ')')
            {
                end = begin + 1;
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.ArgsEnd, Value = ")"
                });
            }
            else if (originData[begin] == ',')
            {
                end = begin + 1;
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.ArgsSplit, Value = ","
                });
            }
            else if (originData[begin] == ';')
            {
                end = begin + 1;
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.ElementSplit, Value = ";"
                });
            }

            string tempWord = "";

            if (!string.IsNullOrEmpty(tempWord = LexicalAnalysis.IsNotKeywordIdentifer(originData, begin, ref end)))
            {
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.Identifer, Value = tempWord
                });
            }
            if (!string.IsNullOrEmpty(tempWord = LexicalAnalysis.isString(originData, begin, ref end)))
            {
                tempWord = tempWord.Substring(1, tempWord.Length - 2);
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.Arg, Value = tempWord
                });
            }
            if (!string.IsNullOrEmpty(tempWord = LexicalAnalysis.isKeyword(originData, begin, ref end)))
            {
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.Arg, Value = tempWord
                });
            }
            if (!string.IsNullOrEmpty(tempWord = LexicalAnalysis.isDigit(originData, begin, ref end)))
            {
                return(new GPCSymbolItem()
                {
                    Type = GPCSymbolType.Arg, Value = tempWord
                });
            }
            return(null);
        }
コード例 #3
0
 public GPCSymbolElement(GPCSymbolItem rIdentifer, List <GPCSymbolItem> rArgs)
 {
     this.Identifer = rIdentifer;
     this.Args      = new List <GPCSymbolItem>(rArgs);
 }