Esempio n. 1
0
        private Exp ParseNameValueExp()
        {
            Exp leftExp = ParseBinaryLogicExp();

            if (tape.HasCurrent && tape.Current.IsKind(TokenKindSymbol.Colon))
            {
                tape.MoveNext();
                Exp rightExp = ParseBinaryLogicExp();
                if (leftExp is ExpChain)
                {
                    ExpChain chainExp = leftExp as ExpChain;
                    if (chainExp.SubCount == 1)
                    {
                        object varobj = chainExp.RawElements[0];
                        if (varobj is LexTokenText)
                        {
                            LexTokenText textToken    = (varobj as LexTokenText);
                            ExpNameValue expNameValue = new ExpNameValue(this.expContext, textToken, rightExp);
                            return(expNameValue);
                        }
                        else
                        {
                            tape.error("参数名称错误");
                            return(rightExp);
                        }
                    }
                    else
                    {
                        tape.error("参数名称的长度不是1");
                        return(rightExp);
                    }
                }
                else if (leftExp is ExpVarBase)
                {
                    ExpVarBase   leftVarExp   = (leftExp as ExpVarBase);
                    LexToken     varToken     = leftVarExp.VarToken;
                    ExpNameValue expNameValue = new ExpNameValue(this.expContext, varToken, rightExp);
                    return(expNameValue);
                }
                else
                {
                    tape.error("调用过程时指定的参数名称只能是标识符");
                    return(rightExp);
                }
            }
            else
            {
                return(leftExp);
            }
        }
Esempio n. 2
0
        private Exp ParseChain()
        {
            ExpChain expChain = new ExpChain(expContext);

            while (tape.HasCurrent)
            {
                if (tape.Current.IsKind(TokenKindSymbol.LBS))
                {
                    ExpBracket subExp = parseBracket();
                    expChain.Add(subExp);
                }
                else if (tape.Current.IsKind(TokenKindSymbol.RBS))
                {
                    break;
                    //tape.error("多余的右括号");
                    //tape.MoveNext();
                }
                else if (tape.Current is LexTokenLiteral)
                {
                    ExpLiteral subExp = parseLiteral();
                    expChain.Add(subExp);
                }
                else if (tape.Current.IsKind(
                             TokenKindKeyword.Ident,
                             TokenKindKeyword.Ident,
                             TokenKindKeyword.DE,
                             TokenKindKeyword.DI,
                             TokenKindKeyword.Each,
                             TokenKindKeyword.NewDefault
                             )
                         )
                {
                    LexToken tok = tape.Current;
                    expChain.Add(tok);
                    tape.MoveNext();
                }
                else
                {
                    break;
                }
            }
            if (expChain.SubCount == 0)
            {
                return(null);
            }
            return(expChain);
        }