private void MaybeCreateVariableFor(Pred pred, Symbol varName, LNode primType) { if (pred.ResultSaver != null) { return; } if (primType == null) { primType = F.Object; _sink.Write(Severity.Error, pred, Localize.Localized("The type of this expression is unknown (did you set LLLPG's 'terminalType' option?)")); } LNode type = primType, oldType; if (pred.VarIsList) { type = _codeGen.GetListType(primType); } if (!_newVarInitializers.ContainsKey(varName)) { _newVarInitializers[varName] = Pair.Create(type, _codeGen.MakeInitializedVarDecl(primType, pred.VarIsList, varName)); } else if (!(oldType = _newVarInitializers[varName].A).Equals(type)) { _sink.Write(Severity.Error, pred, Localize.Localized( "Type mismatch: Variable '{0}' was generated earlier with type {1}, but this predicate expects {2}.", varName, oldType, type)); } pred.ResultSaver = Pred.GetStandardResultSaver(F.Id(varName), pred.VarIsList ? S.AddSet : S.Assign); }