Пример #1
0
        Exp parseTerm()
        {
            //report("parseTerm");
            Exp leftExp = null;

            if (TokenKindHelper.IsLiteral(tape.CurrentKind))// CurrentToken.IsLiteral())
            {
                leftExp = parseLiteral();
            }
            else if (tape.CurrentKind == TokenKind.Each)
            {
                ExpEachWord varExp = new ExpEachWord();
                varExp.EachToken = tape.Current;
                tape.MoveNext();
                return(varExp);
            }
            else if (tape.Current.IsTypeName())
            {
                leftExp = parseTypeExp();
                return(leftExp);
            }
            else if (tape.Current.IsProcPart())
            {
                leftExp = parseProcNamePart();
                return(leftExp);
            }
            else if (tape.Current.IsVarName())
            {
                leftExp = parseVarExp();
                return(leftExp);
            }
            else if (tape.Current.Kind == TokenKind.Ident)
            {
                leftExp = parseVarExp();
                return(leftExp);
            }
            else if (tape.Current.Kind == TokenKind.LBS)
            {
                leftExp = parseBracket();
                return(leftExp);
            }
            else if (tape.Current.Kind == TokenKind.RBS)
            {
                tape.error("多余的右括号");
                tape.MoveNext();
                return(null);
            }
            else if (tape.Current.WKind == WordKind.Unkown)
            {
                var currentText = tape.Current.GetText();
                tape.error("无法识别'" + currentText + "'");
                tape.MoveNext();
                return(null);
            }
            return(leftExp);
        }
Пример #2
0
        protected Exp parseCompareExpr()
        {
            Token opToken;
            Exp   resultExpr = parseAddSub();

            //while (CurrentToken.Kind == TokenKind.GT || CurrentToken.Kind == TokenKind.LT || CurrentToken.Kind == TokenKind.GE
            //    || CurrentToken.Kind == TokenKind.LE || CurrentToken.Kind == TokenKind.NE || CurrentToken.Kind == TokenKind.EQ)
            while (TokenKindHelper.IsCompareOp(tape.CurrentKind))
            {
                opToken = tape.Current;
                tape.MoveNext();
                Exp rightExpr = parseAddSub();
                resultExpr = new ExpBinary()
                {
                    LeftExp = resultExpr, OpToken = opToken, RightExp = rightExpr
                };
            }
            return(resultExpr);
        }
Пример #3
0
        Exp parseCall()
        {
            //report("parseCall");
            List <Exp> exps = new List <Exp>();

            while (tape.Current.Kind == TokenKind.Ident || tape.Current.Kind == TokenKind.LBS || TokenKindHelper.IsLiteral(tape.Current.Kind))//|| CurrentKind == TokenKind.RBS
            {
                Exp term = parseChain();
                exps.Add(term);
            }
            if (exps.Count == 2 && (exps[0] is ExpType) && (exps[1] is ExpBracket))
            {
                ExpNew expNew = new ExpNew();
                expNew.TypeExp    = (exps[0] as ExpType);
                expNew.BracketExp = (exps[1] as ExpBracket);
                return(expNew);
            }
            else if (exps.Count == 0)
            {
                return(null);
            }
            else if (exps.Count == 1 && !(exps[0] is ExpProcNamePart))
            {
                return(exps[0]);
            }
            else
            {
                ExpCall callExp = new ExpCall();
                callExp.Elements = exps;
                return(callExp);
            }
        }