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); } }
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); }