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