private Exp ParseDi() { ExpDi diexp = new ExpDi(this.ExpContext); diexp.KeyToken = (LexTokenText)Tape.Current; diexp.SubjectExp = PopChainsExp(); MoveNext(); diexp.ArgExp = ParseExpect_Exp_Var(); if (Tape.HasCurrent == false) { this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少‘个’匹配"); this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少元素类型名称"); } else { if (Tape.Current is LexToken) { LexToken tok1 = (LexToken)Tape.Current; if (tok1.IsKind(TokenKindKeyword.Ge)) { diexp.GeToken = (LexTokenText)tok1; MoveNext(); } else { this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少‘个’匹配"); } } else { this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少‘个’匹配"); } var data = Tape.Current; if (featurer.IsThisClassName(data) || featurer.IsImportTypeName(data)) { Exp exp = ParseTypes(); diexp.ElementTypeExp = exp; } else { this.ExpContext.FileContext.Errorf(diexp.KeyToken.Position, "‘的’后面缺少元素类型名称"); } } return(diexp); }
Exp parseChain() { //report("parseChain"); Exp leftExp = parseTerm(); if (leftExp == null) { return(null); } while (tape.Current.Kind != TokenKind.EOF) { if (tape.Current.Kind == TokenKind.DE) { ExpDe deExp = new ExpDe(); deExp.KeyToken = tape.Current; deExp.LeftExp = leftExp; tape.MoveNext(); Exp rightExp = parseTerm(); deExp.RightExp = rightExp; leftExp = deExp; } else if (tape.Current.Kind == TokenKind.DI) { ExpDi diExp = new ExpDi(); diExp.KeyToken = tape.Current; diExp.SubjectExp = leftExp; tape.MoveNext(); Exp rightExp = parseTerm(); diExp.ArgExp = rightExp; leftExp = diExp; } else { return(leftExp); } } return(leftExp); }