Exemplo n.º 1
0
        //private void SkipSpaceLine()
        //{
        //    while (tape.HasCurrent)
        //    {
        //        if (tape.Current.Count == 0)
        //        {
        //            tape.MoveNext();
        //        }
        //        else
        //        {
        //            break;
        //        }
        //    }
        //}

        private bool IsSectionHead(LineTokenCollection ltc)
        {
            if (ltc.Count < 2)
            {
                return(false);
            }
            int bracketCounter = 0;

            for (int i = 0; i < ltc.Count; i++)
            {
                LexToken token = ltc.Get(i);
                if (token.IsKind(TokenKindSymbol.LBS))
                {
                    bracketCounter++;
                }
                else if (token.IsKind(TokenKindSymbol.RBS))
                {
                    bracketCounter--;
                }
                else if (token.IsKind(TokenKindSymbol.Colon))
                {
                    if (bracketCounter == 0)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
Exemplo n.º 2
0
        public object ParseCurrent()
        {
            if (!tape.HasCurrent)
            {
                return(null);
            }
            //Debugr.WriteLine(tape.Current.ToString());
            //if (tape.Current.ToString().IndexOf("之和")!=-1)
            //{
            //    Debugr.WriteLine(tape.Current.ToString());
            //}
            BuildCurrentLineTape();
            LexToken firstToken = currLineTokenTape.First;

            if (firstToken.IsKind(TokenKindKeyword.IF))
            {
                StmtRaw stmt = ParseIf();
                return(stmt);
            }
            else if (firstToken.IsKind(TokenKindKeyword.Dang))
            {
                StmtRaw stmt = ParseWhile();
                return(stmt);
            }
            else if (firstToken.IsKind(TokenKindKeyword.Repeat))
            {
                StmtRaw stmt = ParseRepeat();
                return(stmt);
            }
            else if (firstToken.IsKind(TokenKindKeyword.Loop))
            {
                StmtRaw stmt = ParseForeach();
                return(stmt);
            }
            else if (firstToken.IsKind(TokenKindKeyword.Catch))
            {
                StmtRaw stmt = ParseCatch();
                return(stmt);
            }
            else
            {
                List <StmtRaw> stmts = ParseStmtCall();
                return(stmts);
            }
        }
Exemplo n.º 3
0
        private void ParseUseClass(SectionUseRaw ast, List <LexToken> sourceTokens)
        {
            ImportPackageRawParser packageParser = new ImportPackageRawParser();

            for (int i = 0; i < sourceTokens.Count; i++)
            {
                LexToken token = sourceTokens[i];
                if (token.IsKind(TokenKindKeyword.Ident))
                {
                    ast.Parts.Add((LexTokenText)token);
                }
                else if (token.IsKind(TokenKindSymbol.Comma))
                {
                }
                else
                {
                    error(token, string.Format("使用的'{0}'不是正确的类型名称", token.Text));
                }
            }
        }
Exemplo n.º 4
0
        private Exp ParseDi()
        {
            ExpDi diexp = new ExpDi(this.ExpContext);

            diexp.KeyToken   = (LexTokenText)Tape.Current;
            diexp.SubjectExp = PopChainsExp();
            MoveNext();
            diexp.ArgExp = ParseExpect_Exp_Var();
            if (Tape.HasCurrent == false)
            {
                this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少‘个’匹配");
                this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少元素类型名称");
            }
            else
            {
                if (Tape.Current is LexToken)
                {
                    LexToken tok1 = (LexToken)Tape.Current;
                    if (tok1.IsKind(TokenKindKeyword.Ge))
                    {
                        diexp.GeToken = (LexTokenText)tok1;
                        MoveNext();
                    }
                    else
                    {
                        this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少‘个’匹配");
                    }
                }
                else
                {
                    this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少‘个’匹配");
                }
                var data = Tape.Current;
                if (featurer.IsThisClassName(data) || featurer.IsImportTypeName(data))
                {
                    Exp exp = ParseTypes();
                    diexp.ElementTypeExp = exp;
                }
                else
                {
                    this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少元素类型名称");
                }
            }

            return(diexp);
        }
Exemplo n.º 5
0
 private bool isBracketEnd(LexToken tok)
 {
     return(tok.IsKind(TokenKindSymbol.EOF, TokenKindSymbol.Semi, TokenKindSymbol.RBS));
 }
Exemplo n.º 6
0
 public bool IsCompareOp(LexToken tok)
 {
     return(tok.IsKind(TokenKindSymbol.GT, TokenKindSymbol.LT, TokenKindSymbol.GE,
                       TokenKindSymbol.LE, TokenKindSymbol.NE, TokenKindSymbol.EQ));
 }