// return null if this token isn't for this expression parser public IExpression Parse(IParser parser, IStream <IToken> tokenStream, ref IParseError parseError) { IExpression declareExpression = null; IList <IToken> tokens = new List <IToken>(); IToken token = tokenStream.Get(); // the first is the keyword if ((token.Kind == TokenKind.UnquotedWord) && (token.Info == keywords.comment)) { while ((token.Kind != TokenKind.NULL) && (!((token.Kind == TokenKind.UnquotedWord) && (token.Info == keywords.end)))) { tokens.Add(token); token = tokenStream.Get(); } tokens.Add(token); declareExpression = DeclareExpression.Create(parser, tokens, ref parseError); } else { tokenStream.Push(token); } return(declareExpression); }
public DeclareExpression Build() { var expression = new DeclareExpression(_block); var node = new DeclareOperator(_block); while (_reader.HasNext()) { _reader.Next(); var token = _reader.Current(); /* * In this loop,tokens type can only be ',', 'identifer',';','=' * ',',';','=', requires previous token must be an Identifier * */ if (token.TokenType == TokenType.Identifier) { node.Operands.Add(new OperandNode(new JString(token.Value))); } else if (token.OperatorType == OperatorType.Coma)//mutiple variable declaration { requirePreviousIsIdentifier(); continue; } else if (token.OperatorType == OperatorType.ExpressionEnd)//declaration ends { requirePreviousIsIdentifier(); node.DoCheck(); expression.Root = node; return(expression); } else if (token.OperatorType == OperatorType.Assignment)// this expression is a declare-assignment expression { requirePreviousIsIdentifier(); var assign = new DeclareAsignmentNode(_block); var astNode = new AstNodeBuilder(_reader, _block, _intercptChars).Build(); node.DoCheck(); assign.Operands = node.Operands; assign.Operands.Add(astNode); expression.Root = assign; return(expression); } else { //invalid token type throwError(""); } } // expression incomplete throwError(""); return(null); }